WPF применяет стиль только в определенных условиях - PullRequest
0 голосов
/ 12 июня 2019

Мне пришлось адаптировать визуальный стиль моего комбинированного списка из-за перехода с Win7 на Win10, поэтому вот мой текущий стиль для пользовательского комбинированного списка:

<Style TargetType="{x:Type av:XComboBox}">
                <Setter Property="UIElement.SnapsToDevicePixels" Value="True"/>
                <Setter Property="FrameworkElement.OverridesDefaultStyle" Value="True"/>
                <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
                <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
                <Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
                <Setter Property="TextElement.Foreground" Value="Black"/>
                <Setter Property="FrameworkElement.FocusVisualStyle" Value="{x:Null}"/>
                <Setter Property="Control.Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ComboBox">
                            <Grid>
                                <ToggleButton Name="ToggleButton" Grid.Column="2"
                                    ClickMode="Press" Focusable="False"
                                    IsChecked="{Binding Path=IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
                                    Template="{StaticResource ComboBoxToggleButtonTemplate}"/>
                                <ContentPresenter Name="ContentSite" Margin="5, 3, 23, 3" IsHitTestVisible="False"
                                  HorizontalAlignment="Left" VerticalAlignment="Center"                              
                                  Content="{TemplateBinding ComboBox.SelectionBoxItem}" 
                                  ContentTemplate="{TemplateBinding ComboBox.SelectionBoxItemTemplate}"
                                  ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"/>
                                <TextBox Name="PART_EditableTextBox" Margin="1, 3, 23, 3" IsReadOnly="{TemplateBinding IsReadOnly}" Visibility="Hidden" Background="Transparent" HorizontalAlignment="Left" VerticalAlignment="Center" Focusable="True" >
                                    <TextBox.Template>
                                        <ControlTemplate TargetType="TextBox" >
                                            <Border Name="PART_ContentHost" Focusable="False" />
                                        </ControlTemplate>
                                    </TextBox.Template>
                                </TextBox>
                                <!-- Popup showing items -->
                                <Popup Name="Popup" Placement="Bottom" Focusable="False" AllowsTransparency="True" IsOpen="{TemplateBinding ComboBox.IsDropDownOpen}" PopupAnimation="Slide">
                                    <Grid Name="DropDown" SnapsToDevicePixels="True" MinWidth="{TemplateBinding FrameworkElement.ActualWidth}" MaxHeight="{TemplateBinding ComboBox.MaxDropDownHeight}">
                                        <Border Name="DropDownBorder" Background="White" Margin="0, 1, 0, 0" CornerRadius="0" BorderThickness="1,1,1,1" BorderBrush="{StaticResource ComboBoxNormalBorderBrush}"/>
                                        <ScrollViewer Margin="4" SnapsToDevicePixels="True">
                                            <ItemsPresenter KeyboardNavigation.DirectionalNavigation="Contained" />
                                        </ScrollViewer>
                                    </Grid>
                                </Popup>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="ItemsControl.HasItems" Value="False">
                                    <Setter Property="FrameworkElement.MinHeight" TargetName="DropDownBorder" Value="95"/>
                                </Trigger>
                                <Trigger Property="UIElement.IsEnabled" Value="False">
                                    <Setter Property="TextElement.Foreground" Value="{StaticResource ComboBoxDisabledForegroundBrush}"/>
                                </Trigger>
                                <Trigger Property="ComboBox.IsVisible" Value="True">
                                    <Setter Property="Border.BorderBrush" TargetName="DropDownBorder" Value="#878787"/>
                                </Trigger>                                
                                <Trigger Property="ItemsControl.IsGrouping" Value="True">
                                    <Setter Property="ScrollViewer.CanContentScroll" Value="False"/>
                                </Trigger>
                                <Trigger Property="ComboBox.IsEditable" Value="True">
                                    <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/>
                                    <Setter Property="UIElement.Visibility" TargetName="PART_EditableTextBox" Value="Visible"/>
                                    <Setter Property="UIElement.Visibility" TargetName="ContentSite" Value="Hidden"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

Поскольку приложение работает как на Win7, так и на Win10, я бы применил этот стиль только на Win10. Есть какой-либо способ сделать это? Я ничего не мог оштрафовать по этому поводу; Я думал о конвертере, но как его применить?

1 Ответ

0 голосов
/ 12 июня 2019

Вы можете присвоить Style значение x:Key и реализовать собственное расширение разметки:

public class Windows10StyleExtension : MarkupExtension
{
    private readonly string _key;

    public Windows10StyleExtension(string key)
    {
        _key = key;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (!IsWindows7OrLower)
            return new StaticResourceExtension(_key).ProvideValue(serviceProvider);
        return null;
    }

    private bool IsWindows7OrLower =>
        (Environment.OSVersion.Version.Major + (double)Environment.OSVersion.Version.Minor / 10) <= 6.1;
}

XAML:

<Style x:Key="style" TargetType="{x:Type av:XComboBox}">
...
<av:XComboBox Style="{local:Windows10Style style}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...