Как заморозить столбец в сетке и сделать так, чтобы он всегда отображался в клиентской области пользовательского элемента управления WPF

#c# #wpf #grid

#c# #wpf #сетка

Вопрос:

Я искал в stackoverflow, и для DataGrid есть свойство FrozenColumnCount, но Grid control не имеет этого свойства.

У нас есть сетка с 2 столбцами. Теперь нам нужно заморозить последний столбец в сетке и сделать так, чтобы он всегда отображался в клиентской области пользовательского элемента управления. в противном случае, если данные (например, текст) в первом столбце слишком длинные, клиент должен использовать мышь, чтобы перетащить полосу прокрутки горизонта, чтобы отобразить 2-й столбец.

Мы хотим, чтобы клиент всегда мог видеть данные во 2-м столбце, поэтому мне интересно, можем ли мы заморозить указанный столбец.

введите описание изображения здесь

Обновление 1: я вставляю свой код для элемента управления древовидным представлением.

 <HierarchicalDataTemplate x:Uid="HierarchicalDataTemplate_1" x:Key="MyPaletteMyTestTreeCell" 
                                      ItemsSource="{Binding Converter={StaticResource MyTestDataAccessor}}" 
                                      ItemTemplateSelector="{StaticResource MyTestDataAccessor}">
    <ContentControl x:Uid="ContentControl_1" MouseDoubleClick="Item_MouseDoubleClick" ContextMenu="{StaticResource TreeListViewItemContextMenu}" MouseRightButtonDown="MRClick" Focusable="False">
        <Grid x:Uid="Grid_2" Background="Transparent">
            <Grid.ColumnDefinitions>
                <ColumnDefinition x:Uid="ColumnDefinition_3" />
                <ColumnDefinition x:Uid="ColumnDefinition_2" Width="Auto" />
            </Grid.ColumnDefinitions>
            <Grid x:Uid="Grid_3" Grid.Column="0">
                <StackPanel x:Uid="StackPanel_3" HorizontalAlignment="Left" Orientation="Horizontal">
                    <pc:ThemedImage x:Uid="Image_4" 
                                LightSource="{Binding CategoryId, Converter={StaticResource LightMyTestIconConverter}, Mode=OneWay}" 
                                DarkSource="{Binding CategoryId, Converter={StaticResource DarkMyTestIconConverter}, Mode=OneWay}" 
                                Width="16" Height="16" 
                                Margin="0,1,0,1"
                                VerticalAlignment="Center"/>
                    <TextBlock x:Uid="TextBlock_13" Text="{Binding Name}" VerticalAlignment="Center" Margin="3,0,0,1" TextTrimming="CharacterEllipsis" TextWrapping="NoWrap"/>
                </StackPanel>
            </Grid>
            <Grid x:Uid="Grid_4" Grid.Column="1">
                <CheckBox x:Uid="CheckBox_3" HorizontalAlignment="Right" Click="CheckBox_Click" Grid.Column="1" Style="{StaticResource MyPaletteMyTestVisibilityStyle}" ToolTip="On/Off" Focusable="False">
                    <CheckBox.IsChecked>
                        <Binding x:Uid="Binding_1" Converter="{StaticResource MyTestDataAccessor}" Path="Visibility" Mode="OneWay">
                            <Binding.ConverterParameter>
                                <FrameworkElement x:Uid="FrameworkElement_1" DataContext="{TemplateBinding DataContext}" Tag="Visibility"/>
                            </Binding.ConverterParameter>
                        </Binding>
                    </CheckBox.IsChecked>
                    <CheckBox.IsEnabled>
                        <Binding x:Uid="Binding_2" Converter="{StaticResource MyTestDataAccessor}" Path="Visibility" Mode="OneWay">
                            <Binding.ConverterParameter>
                                <FrameworkElement x:Uid="FrameworkElement_2" DataContext="{TemplateBinding DataContext}" Tag="Enabled"/>
                            </Binding.ConverterParameter>
                        </Binding>
                    </CheckBox.IsEnabled>
                </CheckBox>
            </Grid>
        </Grid>
    </ContentControl>
</HierarchicalDataTemplate>
  

РЕШЕНИЕ:

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

большое спасибо.

Ответ №1:

Очевидно, вы неправильно об этом думаете. Вам просто нужно поместить столбец, который вы хотите «заморозить», во внешний столбец Grid . Попробуйте что-нибудь такое:

 <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <Grid Grid.Column="0">
        <!-- Your other controls -->
    </Grid>
    <Grid Grid.Column="1" Name="FrozenColumn">
        <!-- Your frozen controls -->
    </Grid>
</Grid>
  

Комментарии:

1. Я обновил свой поток и добавил код xaml, который я использовал. Я изменил то, что вы предлагаете, но все равно получил тот же результат. Полоса прокрутки горизонта все еще существует, и текст длинного слова не был многоточием. Есть комментарии? спасибо.

2. Вам просто нужно научиться использовать Grid my friend . Параметр Width="Auto" следует использовать только для содержимого, подобного вашему правому столбцу, для которого не требуется так много места. Для среднего столбца с текстом должно быть установлено значение Width="*" .