Воссоздать Xaml в коде - PullRequest
       0

Воссоздать Xaml в коде

0 голосов
/ 30 марта 2012

У меня есть какой-то 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;

Пара заметок. Вместо того, чтобы пытаться воссоздать DataTemplate точно так, как он был в Xaml, я вставил его в тег UserControl.Resources в Xaml. Затем я использую FindResource для установки CellTemplate.

Так вот моя проблема. Когда я делаю выше, макет в конечном итоге выглядит так:

Broken list

Обратите внимание на очень маленькую оранжевую точку ... их около дюжины, которые видны только потому, что выделение элемента выделяет его оранжевой рамкой. По этой же причине каждый элемент списка мал. Беда в том - как мне сделать его "нормального" размера?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2012

Я так и не понял, почему мой код не соответствует XAML.Вместо этого я в конечном итоге использовал XAML, а затем просто создал ссылку на представление для повторного использования в дальнейшем.

0 голосов
/ 30 марта 2012

Не тот ответ, который вы ищете, но я бы использовал ItemsControl с WrapPanel в качестве ItemPanelTemplate и использовал ItemTemplateSelector для стилизации каждого элемента в зависимости от типа, а не добавления элементов в ListView вручную.Вы можете просто использовать WrapPanel, чтобы получить такой же внешний вид, но я думаю, вы хотите, чтобы он был гибким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...