سؤال

يبدو أن هناك مشكلة مع اثنين من الشبكات التي تحتوي على عناصر محددة بطريقة معينة ، SharedSizeGroup.

هذا السؤال هو استجابة في وقت سابق من السؤال من المستخدم D. H. حاولت الإجابة.سامحوني على طول ، ولكنه يساعد على إظهار المشكلة بصريا.

الأصلي له سؤال لماذا الشبكتين مع SharedSizeGroup لا تغيير على نفس الارتفاع عندما استوفيت شروط معينة (تغيير حجم مجموعة TextBlock في الجانب الأيمن الشبكة).أخذت له سبيل المثال وتوسيع لأنه يشتبه في أنه كان علي القيام به مع قياس/ترتيب دورة.

اتضح أنه في الواقع يجب أن نفعل هذا مع قياس وترتيب.في الواقع له علاقة لا القيام التدبير. أشعر أن هذا قد يكون على الأقل قضية ، إن لم يكن علة ، ولكن ترغب في الحصول على تفسير السلوك.

هنا لمحة سريعة عن ما يحدث (متوهج الألوان لأغراض العرض فقط).

بدء
سواء شبكات ثلاثة صفوف ، كل منها يحتوي على TextBlock.الصف الأوسط من SharedSizeGroup.نص الصف الأوسط لا بد أن ActualHeight من TextBlock ، مع ارتفاع الأولي الملكية الثابت ترميز القيم التي تراها.الأرقام أدناه الشبكات تمثل ActualHeight من تلك الشبكة.علما بأن BackgroundColor من اليسار الشبكة الخضراء.

Startup

زيادة الجانب الأيمن TextBlock
عند الجانب الأيمن الشبكة هو زيادة في الحجم, يمكنك أن ترى أن كل شبكات تغيير حجم إلى آفاق جديدة ، بسبب SharedSizeGroup.العمود في اليمين ويعكس قياس و ترتيب المكالمات من الشبكات.

Increased In Size

خفض الجانب الأيمن TextBlock ولكن لا يزال أكبر من الجانب الأيسر TextBlock
عند الجانب الأيمن الشبكة هو تناقص في الحجم, ولكن لا يزال أكبر من حجم القرص الثابت تلوينها TextBlock من الجانب الأيسر ، يمكنك أن ترى أن كل شبكات مرة أخرى تغيير حجم إلى آفاق جديدة ، بسبب SharedSizeGroup.العمود في اليمين ويعكس قياس و ترتيب المكالمات من الشبكات.

Decreased to Minimum Size

خفض الجانب الأيمن TextBlock أقل من حجم الجانب الأيسر TextBlock
عند الجانب الأيمن الشبكة هو انخفاض في حجم أقل من حجم القرص الثابت تلوينها TextBlock من الجانب الأيسر ، يمكنك أن ترى أن الجانب الأيسر الشبكة لا تنقص إلى "المناسب" الحجم ، كما يتضح من رؤية خلفية خضراء من الشبكة في الجزء السفلي ، وحقيقة أن حجم الشبكة 150 ، وليس 130.

إذا نظرتم إلى المعلومات على اليمين ستلاحظ أن تترك الشبكة لم يرتب ، ولكن لم تفعل التدبير.

Decreased Past Size


هنا هو رمز المثال تكرار هذه المسألة.

InfoGrid و InfoGridEventArgs الطبقات

using System.Windows;
using System.Windows.Controls;
namespace GridMeasureExample
{
    class InfoGrid : Grid
    {
        protected override Size ArrangeOverride(Size arrangeSize)
        {
            CallReportInfoEvent("Arrange");
            return base.ArrangeOverride(arrangeSize);
        }
        protected override Size MeasureOverride(Size constraint)
        {
            CallReportInfoEvent("Measure");
            return base.MeasureOverride(constraint);
        }
        public event EventHandler<InfoGridEventArgs> ReportInfo;
        private void CallReportInfoEvent(string message)
        {
            if (ReportInfo != null)
                ReportInfo(this, new InfoGridEventArgs(message));
        }
    }
    public class InfoGridEventArgs : EventArgs
    {
        private InfoGridEventArgs()
        {
        }
        public InfoGridEventArgs(string message)
        {
            this.TimeStamp = DateTime.Now;
            this.Message = message;
        }
        public DateTime TimeStamp
        {
            get;
            private set;
        }
        public String Message
        {
            get;
            private set;
        }
    }
}

النافذة الرئيسية XAML

<Window x:Class="GridMeasureExample.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:GridMeasureExample"
        Title="SharedSizeGroup" Height="500" Width="500">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <StackPanel Grid.Column="0" 
                    Grid.Row="0"
                    Orientation="Horizontal" 
                    HorizontalAlignment="Left"
                    VerticalAlignment="Top"
                    Grid.IsSharedSizeScope="True">

            <StackPanel Orientation="Vertical" Width="100">
                <local:InfoGrid x:Name="grid1" Background="Green" ShowGridLines="True">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="15" />
                        <RowDefinition SharedSizeGroup="Group1" />
                        <RowDefinition Height="15" />
                    </Grid.RowDefinitions>
                    <TextBlock Background="Blue" Grid.Row="0" Text="Row 0"/>
                    <TextBlock Background="Red" Grid.Row="1" Name="textBlock1" Height="100"
                           Text="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"/>
                    <TextBlock Background="Blue" Grid.Row="2" Text="Row 2" />
                </local:InfoGrid>
                <TextBlock Text="{Binding Path=ActualHeight, ElementName=grid1}" />
            </StackPanel>

            <StackPanel Orientation="Vertical" Width="100">
                <local:InfoGrid x:Name="grid2" Background="Yellow" ShowGridLines="True">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="15" />
                        <RowDefinition SharedSizeGroup="Group1" />
                        <RowDefinition Height="15" />
                    </Grid.RowDefinitions>
                    <TextBlock Background="Orange" Grid.Row="0" Text="Row 0" />
                    <TextBlock Background="Purple" Grid.Row="1" Name="textBlock2" Height="150"
                           Text="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"/>
                    <TextBlock Background="Orange" Grid.Row="2" Text="Row 2" />
                </local:InfoGrid>
                <TextBlock Text="{Binding Path=ActualHeight, ElementName=grid2}" />
            </StackPanel>

        </StackPanel>

        <ListBox x:Name="lstInfo"
                 Grid.Column="1"
                 Grid.Row="0"
                 Margin="10,0,0,0"
                 HorizontalAlignment="Stretch"
                 VerticalAlignment="Stretch" />

        <UniformGrid Grid.Column="0"
                     Grid.Row="1"
                     Grid.ColumnSpan="2"
                     Columns="2"
                     HorizontalAlignment="Center"
                     Margin="5">
            <Button x:Name="btnIncrease" Margin="4,0">Increase</Button>
            <Button x:Name="btnDecrease" Margin="4,0">Decrease</Button>
        </UniformGrid>

    </Grid>

</Window>

النافذة الرئيسية منشئ (فقط التعليمات البرمجية في التعليمات البرمجية-خلف)

العامة Window1() { InitializeComponent();

    btnIncrease.Click += (s, e) => 
        {
            lstInfo.Items.Add(String.Format("{0} Increase Button Pressed", DateTime.Now.ToString("HH:mm:ss.ffff")));
            textBlock2.Height += 30;
        };
    btnDecrease.Click += (s, e) =>
        {
            lstInfo.Items.Add(String.Format("{0} Decrease Button Pressed", DateTime.Now.ToString("HH:mm:ss.ffff")));
            if (textBlock2.ActualHeight >= 30)
                textBlock2.Height -= 30;
        };

    grid1.ReportInfo += (s, e) => lstInfo.Items.Add(String.Format("{0} Left Grid: {1}", e.TimeStamp.ToString("HH:mm:ss.ffff"), e.Message));
    grid2.ReportInfo += (s, e) => lstInfo.Items.Add(String.Format("{0} Right Grid: {1}", e.TimeStamp.ToString("HH:mm:ss.ffff"), e.Message));
}
هل كانت مفيدة؟

المحلول

ووفقا لمايكروسوفت, إنها علة.

ويبدو أن الخلل في WPF ، Microsoft هو على علم به ، التحقيق في الحل.

إذا كنت بحاجة إلى مساعدة مع الحل ، يرجى الاتصال بدعم Microsoft في

http://support.microsoft.com/default.aspx?id=fh en-us;offerprophone

يمكنك أيضا أن يقدم علة ردود الفعل برنامج الأغذية العالمي بشأن هذه المسألة في...

http://connect.microsoft.com/VisualStudio

لقد قدمت هذا الخلل على الاتصال الموقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top