WPF DataGrid иногда отображает неправильный цвет или шрифт - PullRequest
0 голосов
/ 10 марта 2020

У меня есть приложение WCF, которое регистрирует сообщения. Сообщения отображаются в виде DataGrid. Каждая строка содержит четыре столбца для времени, типа (например, Debug, Error, Warning…), пространства имен (например, System.Threading) и самого сообщения.

Каждая строка отображается цветом в зависимости от типа. Например, красный для ошибки. Текст для всей информации (строки / столбцы) в DataGrid должен отображаться одним и тем же шрифтом.

В XAML видно, что я указал параметры шрифта и цвета шрифта в DataGrid.RowStyle. «Настройки» - это класс, который содержит свойства для настроек и цветов шрифта.

Моя проблема в том, что время от времени строка отображается с неправильным цветом и / или шрифтом. Может кто-нибудь объяснить, что происходит?

Является ли стиль лучшим способом задания настроек и цветов шрифта? Обратите внимание, что я sh установил эти параметры как динамические c, чтобы пользователь мог изменить их во время выполнения. Любые предложения по стилю или реализации приветствуются.

<DataGrid Name="MessagesGrid" ItemsSource="{Binding Messages}" AutoGenerateColumns="False" IsReadOnly="True">
<DataGrid.RowStyle>
    <Style TargetType="DataGridRow">
        <Style.Setters>
            <EventSetter Event="Control.RequestBringIntoView" Handler="RequestBringIntoViewHandler"/>

            <Setter Property="FontFamily" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.MessageListFont.FontFamily}" />
            <Setter Property="FontSize" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.MessageListFont.Size}" />
            <Setter Property="FontWeight" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.MessageListFont.Weight}" />
        </Style.Setters>

        <Style.Triggers>
            <!--colors for different types-->
            <DataTrigger Binding="{Binding Type}" Value="Debug">
                <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.DebugBrush}"></Setter>
            </DataTrigger>

            <DataTrigger Binding="{Binding Type}" Value="Error">
                <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.ErrorBrush}"></Setter>
            </DataTrigger>

            <DataTrigger Binding="{Binding Type}" Value="Fatal">
                <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.FatalBrush}"></Setter>
            </DataTrigger>

            <DataTrigger Binding="{Binding Type}" Value="Info">
                <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.InfoBrush}"></Setter>
            </DataTrigger>

            <DataTrigger Binding="{Binding Type}" Value="Trace">
                <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.TraceBrush}"></Setter>
            </DataTrigger>

            <DataTrigger Binding="{Binding Type}" Value="Warn">
                <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.WarningBrush}"></Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.RowStyle>

<DataGrid.Columns>
    <!--using converter for some fields in case one or more are null.  
                    if null, then display a string (MissingFieldString) indicating it was not in the message-->

    <DataGridTextColumn Header="Time">
        <DataGridTextColumn.Binding>
            <MultiBinding Converter="{StaticResource ResourceKey=NullableTypeConverter}">
                <Binding Path="Time" />
                <Binding ElementName="MessagesGrid" Path="DataContext.MissingFieldString" />
            </MultiBinding>
        </DataGridTextColumn.Binding>
    </DataGridTextColumn>

    <DataGridTextColumn Header="Type">
        <DataGridTextColumn.Binding>
            <MultiBinding Converter="{StaticResource ResourceKey=NullableTypeConverter}">
                <Binding Path="Type" />
                <Binding ElementName="MessagesGrid" Path="DataContext.MissingFieldString" />
            </MultiBinding>
        </DataGridTextColumn.Binding>
    </DataGridTextColumn>

    <DataGridTextColumn Header="Namespace">
        <DataGridTextColumn.Binding>
            <MultiBinding Converter="{StaticResource ResourceKey=NullableTypeConverter}">
                <Binding Path="Namespace" />
                <Binding ElementName="MessagesGrid" Path="DataContext.MissingFieldString" />
            </MultiBinding>
        </DataGridTextColumn.Binding>
    </DataGridTextColumn>

    <DataGridTextColumn Header="Message" Binding="{Binding Message}"/>
</DataGrid.Columns>

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