Динамическое выравнивание ширины столбцов WPF DataGrid - PullRequest
0 голосов
/ 11 октября 2019

Существует WPF DataGrid с функцией динамического изменения FontSize для события Ctrl + MouseWheel.
Он реализован с использованием функции Caliburn cal: Message.Attach:

<!-- xaml -->
cal:Message.Attach="[Event PreviewMouseWheel] = [Action ChangeDataGridFont($eventArgs)]"

C # ViewModel:

public void ChangeDataGridFont(MouseWheelEventArgs args)
{
    if (Keyboard.Modifiers == ModifierKeys.Control && args != null)
    {
        DataGridFontSize += Math.Sign(args.Delta) * 2;
        args.Handled = true;
    }
}

DataGridFontSize - это свойство виртуальной машины, которое привязано к CellStyle из DataGrid.

При загрузке ширина столбцов выравнивается по содержимому - ОК:
enter image description here

Если пользователь увеличивает размер шрифта, ширина столбцов автоматически настраивается - ОК:
enter image description here

Однако, если размер шрифта равенуменьшилось - столбцы не настроены. См. Пробелы:
enter image description here

Есть ли способ преодолеть этот эффект (в рамках MvvM, если это возможно)?

Обновление: похоже, что нам нужно обновить ширину столбцов вручную, когда мы изменим FontSize. Я могу привязать ширину столбца в соответствующем стиле:

<Style x:Key="IdCellStyle" TargetType="{x:Type DataGridCell}" >
    <Setter Property="Width" Value="{Binding DataContext.ColWidth, Mode=TwoWay, 
                                    RelativeSource={RelativeSource AncestorType=UserControl}}" />
    ....
</Style>

и определить свойство:

public double ColWidth
{
    get => _colWidth;
    set
    {
        _colWidth = value;
        NotifyOfPropertyChange();
    }
}

Что я должен установить ColWidth в DataGridFontSize setter?

1 Ответ

1 голос
/ 11 октября 2019

Я только что добавил Width для DataGridColumn, похоже, что это работает. Попробуйте.

enter image description here

<Window.Resources>
    <XmlDataProvider x:Key="MockList"   XPath="/MockObjects/*" >
        <x:XData >
            <MockObjects xmlns="">
                <MockObject  Name="Louis" Type="TTTT" Number="1" />
                <MockObject Name="Joseph" Type="TTTT" Number="2" />
                <MockObject Name="Papineau" Type="ZZZZ" Number="3" />
            </MockObjects>
        </x:XData>
    </XmlDataProvider>
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource MockList}}" >
    <DataGrid HorizontalAlignment="Stretch" Margin="10" VerticalAlignment="Stretch" 
              ItemsSource="{Binding Mode=Default, XPath=/MockObjects/MockObject}" 
              AutoGenerateColumns="False" PreviewMouseWheel="UIElement_OnPreviewMouseWheel">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding XPath=@Name}" Width="*"></DataGridTextColumn>
            <DataGridTextColumn Header="Type" Binding="{Binding XPath=@Type}" Width="*"></DataGridTextColumn>
            <DataGridTextColumn Header="Number" Binding="{Binding XPath=@Number}" Width="*"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...