سؤال

ما زلت أخدع مع WPF والتعلم كما أذهب. محاولة الآن بناء مجموعة ديناميكية من عناصر التحكم (معظمها أزرار ولكن قد تتضمن مربعات الاختيار وغيرها).

لم يكن لدي أي فكرة عن أفضل طريقة للقيام بذلك ، لذا حاولت إنشاء نمط عناصر Control ثم أضف العناصر إلى exterpspresenter داخل Wrappanel. سرعان ما أدركت أن العناصر لن تلتف لأنها لم تكن داخل Wrappanel بشكل فعال ما لم أضعها على أنها itemShost. مثله:

<Style x:Key="ButtonPanelGroup" TargetType="{x:Type ItemsControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ItemsControl}">
                <Border CornerRadius="5"
                        BorderBrush="{StaticResource DarkColorBrush}"
                        BorderThickness="1"
                        Margin="5">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>

                        <WrapPanel IsItemsHost="True" FlowDirection="LeftToRight">
                            <ItemsPresenter />
                        </WrapPanel>

                        <ContentPresenter ContentSource="Name" Grid.Row="1" />

                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

لاحظ أن هذا عمل مستمر ، وهناك العديد من تأثيرات التصميم التي ما زلت بحاجة إلى تنفيذها. هنا أستخدمه:

<UniformGrid Rows="1">
    <ItemsControl Name="Group1" Style="{StaticResource ButtonPanelGroup}">
        <Button>Button1</Button>
        <Button>Button2</Button>
        <CheckBox>TickBox</CheckBox>
    </ItemsControl>

    <ItemsControl Name="Group2" Style="{StaticResource ButtonPanelGroup}">
        <Button>Button3</Button>
        <Button>Button4</Button>
        <Button>Button5</Button>
    </ItemsControl>

    <ItemsControl Name="Group3" Style="{StaticResource ButtonPanelGroup}">
        <Button>Button6</Button>
        <Button>Button7</Button>
        <Button>Button8</Button>
    </ItemsControl>
</UniformGrid>

لاحظ أيضًا أنه لا يزال هناك عمل مستمر لأن Gresidgrid لن يكون السبيل للذهاب إلى هنا وأيضًا يمكن أن يكون الهوامش ألمًا (هل هناك أي هوامش تتداخل؟) لذلك سيكون موضع تقدير.

الآن إلى المشكلة الحقيقية. هذا لا يعمل أحصل على خطأ:

لا يمكن إضافة كائن "heatspresenter" إلى "Wrappanel". لا يمكن تعديل مجموعة الأطفال بشكل صريح من اللوحة المستخدمة كـ heatspanel لعناصر UnsControl. العناصر Control يولد عناصر الطفل للوحة. خطأ في الكائن 'system.windows.controls.itemspresenter'.

لذا ، ما هي أفضل طريقة لفعل شيء كهذا (أحب أن تكون قادرًا على رمي الأزرار وغيرها من عناصر التحكم في itemControl و Late Up Real Nice). هل سيكون من الأفضل وضع عناصر التحكم في مجموعة من نوع ما وتكرارها.

أحب أن أنجزها بشكل جيد ولكن مهارات WPF الخاصة بي لا تزال غير موجودة. هل هناك أي كتب WPF تدرس ما وراء الأساسيات وتظهر كيف سيفعل ذلك Pro حقًا؟

هل كانت مفيدة؟

المحلول

قد ترغب في إلقاء نظرة على عناصر spanel منشأه:

يحصل أو تعيين القالب الذي يحدد اللوحة التي تتحكم في تخطيط العناصر.

مثال:

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

ويمكنك ضبطه بأسلوب على النحو التالي:

<Style TargetType="ItemsControl">
    <Setter Property="ItemsPanel">
      <Setter.Value>
            <ItemsPanelTemplate>
                <WrapPanel />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>

نصائح أخرى

لا تنس تعريف خاصية Clue ISITEMSHOST = "True". وإلا فإن العناصر الخاصة بك لن يعرض العناصر الخاصة بك.

<ListBox ItemsSource="{Binding MyItemsSource}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate >
                <WrapPanel IsItemsHost="True"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ListBox>

إليك بديلًا بسيطًا آخر لإبطاء حل DataGrid / Xceed DataGrid و Wrappanel. قد يكون مفيدًا عندما يكون الكثير من البيانات أو الجدول بأكمله فقط للتحرير. باستخدام العناصر Control + Grid.issharedsizescope = "True"

مزيد من المعلومات هنا: https://wpf.2000things.com/tag/issharedsizescope/+ على العناصر المسكونة في الأداء: افتراضية العناصر المستحقة؟

<Grid Grid.IsSharedSizeScope="True" Margin="0,30,0,0">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="50" Width="Auto" SharedSizeGroup="Id" />
            <ColumnDefinition MinWidth="50" Width="Auto" SharedSizeGroup="Time"  />
        </Grid.ColumnDefinitions>
        <Border Grid.Column="0" >
            <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" Text="Header1" />
        </Border>
        <Border Grid.Column="1" >
            <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" Text="Header2" />
        </Border>
    </Grid>

    <ItemsControl Grid.Row="1" ItemsSource="{Binding RunInstance.ConcentrationGradient.Steps}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition MinWidth="50" Width="Auto" SharedSizeGroup="Id" />
                        <ColumnDefinition MinWidth="50" Width="Auto" SharedSizeGroup="Time" />
                    </Grid.ColumnDefinitions>
                    <Border Grid.Column="0">
                        <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" Text="{Binding Index, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
                    </Border>
                     <Border Grid.Column="1">
                        <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" Text="{Binding Time, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
                    </Border>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top