У меня есть какой-то 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.
Так вот моя проблема. Когда я делаю выше, макет в конечном итоге выглядит так:
Обратите внимание на очень маленькую оранжевую точку ... их около дюжины, которые видны только потому, что выделение элемента выделяет его оранжевой рамкой. По этой же причине каждый элемент списка мал. Беда в том - как мне сделать его "нормального" размера?