【问题标题】:Recreate Xaml in Code在代码中重新创建 Xaml
【发布时间】:2012-04-30 21:16:32
【问题描述】:

我尝试在代码中重新创建一些 Xaml (WPF)。我想我已经接近了,但我遇到了一些麻烦......这是我的 Xaml:

<ListView Name="lbDevices" SelectionChanged="lbDevices_SelectionChanged" VerticalAlignment="Stretch" Grid.Row="1">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Horizontal" Width="{Binding (FrameworkElement.ActualWidth), RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}" ScrollViewer.HorizontalScrollBarVisibility="Hidden"></WrapPanel>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListView.View>
            <GridView>
                <GridView.ColumnHeaderContainerStyle>
                    <Style>
                        <Setter Property="FrameworkElement.Visibility" Value="Collapsed" />
                    </Style>
                </GridView.ColumnHeaderContainerStyle>
                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <!-- This is a custom control -->
                            <l:HaDeviceDisplayer DataContext="{Binding .}" ></l:HaDeviceDisplayer>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

以上内容完美地展示了我的需求。它看起来像这样:

这是我在代码中重新创建它的尝试:

            GridView gv = new GridView();
            gv.AllowsColumnReorder = false;

            var hiddenStyle = new Style();
            gv.ColumnHeaderContainerStyle = hiddenStyle;
            gv.ColumnHeaderContainerStyle.Setters.Add(new Setter(FrameworkElement.VisibilityProperty, Visibility.Collapsed));

            ItemsPanelTemplate panelTemplate = new ItemsPanelTemplate();
            var fact = new FrameworkElementFactory(typeof(WrapPanel));
            fact.SetValue(WrapPanel.OrientationProperty, Orientation.Horizontal);
            fact.SetValue(ScrollViewer.HorizontalScrollBarVisibilityProperty, ScrollBarVisibility.Hidden);

            var binding = new Binding() {
                RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(ScrollContentPresenter), 1),
                Path = new PropertyPath("(FrameworkElement.ActualWidth)")
            };
            fact.SetBinding(WrapPanel.WidthProperty, binding);

            panelTemplate.VisualTree = fact;
            lbDevices.ItemsPanel = panelTemplate;

            GridViewColumn c1 = new GridViewColumn();
            c1.CellTemplate = (DataTemplate)FindResource("DeviceDisplayer");
            lbDevices.View = gv;

一些笔记。我没有尝试完全按照我在 Xaml 中的方式重新创建 DataTemplate,而是将其粘贴在 Xaml 中的 UserControl.Resources 标记中。然后我使用 FindResource 来设置 CellTemplate。

所以这是我的问题。当我执行上述操作时,布局最终看起来像这样:

请注意非常小的橙色圆点...大约有十几个是可见的,因为选择一个项目以橙色边框突出显示它。出于同样的原因,每个列表项都很小。问题是 - 我如何让它“正常”大小?

【问题讨论】:

    标签: wpf xaml c#-4.0


    【解决方案1】:

    不是您要寻找的答案,但我会使用带有 WrapPanel 的 ItemsControl 作为 ItemPanelTemplate,并使用 ItemTemplateSelector 根据类型设置每个项目的样式,而不是手动将项目添加到 ListView。您可以只使用 WrapPanel 来获得相同的外观,但我猜您希望它具有灵活性。

    【讨论】:

      【解决方案2】:

      我从来没有弄清楚为什么我的代码与 XAML 不匹配。相反,我最终使用了 XAML,然后只是创建了对视图的引用以供以后重用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        相关资源
        最近更新 更多