代码之家  ›  专栏  ›  技术社区  ›  HAdes

不同的Windows XP样式正在改变我的控制外观,我如何避免它?

  •  2
  • HAdes  · 技术社区  · 15 年前

    在我发布供用户测试的版本之前,我认为我的用户控件、样式和布局等一切都很好。他们问是否切换按钮可以绿色时,选中。我说是的,但不是。我检查了我的机器,它是绿色的。结果发现他和我有不同的WindowsXP风格。也就是说,他有“Windows经典风格”。

    如何避免这种情况并强制使用我的样式,而不管窗口的样式如何?

    <UserControl.Resources>
        <Style x:Key="MyToggStyle" TargetType="{x:Type ToggleButton}">
            <Setter Property="Content" Value="On" />
            <Setter Property="IsChecked" Value="True" />
            <Setter Property="Background" Value="Green" />
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="False">
                    <Setter Property="Content" Value="Pff" />
                    <Setter Property="Background" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot">
        <ToggleButton FontWeight="Bold" 
                      IsChecked="{Binding Path=IsChecked, Mode=TwoWay}"
                      Style="{StaticResource MyToggStyle}"/>
    </Grid>
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Jay    15 年前

    您必须完全覆盖控制模板,因为默认的chrome使用操作系统设置。

    在ExpressionBlend中比在Visual Studio中更容易执行此操作。

    以下是默认模板的简化版本 ToggleButton :

    <Style TargetType="{x:Type ToggleButton}">
                <Setter Property="Background" Value="White"/>
                <Setter Property="BorderThickness" Value="1"/>
                <Setter Property="HorizontalContentAlignment" Value="Center"/>
                <Setter Property="VerticalContentAlignment" Value="Center"/>
                <Setter Property="Padding" Value="1"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ToggleButton}">
                            <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" RenderDefaulted="{TemplateBinding Button.IsDefaulted}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}">
                                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/>
                            </Microsoft_Windows_Themes:ButtonChrome>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter Property="Foreground" Value="#ADADAD"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
    

    注意控制使用 Microsoft_Windows_Themes:ButtonChrome . 如果您摆脱或替换了该Chrome,您的用户显示应该与您自己的匹配(不要删除 ContentPresenter 不过,这就是按钮文本/内容的位置)。如果你把它取下来,你会有一个扁平的按钮。您可以为它创建视觉状态和动画,但同样,这在混合中更容易实现。

    注意:命名空间别名为 Microsoft_Windows_Themes 在这种情况下是 xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"

        2
  •  1
  •   Peter Mortensen icecrime    14 年前

    使用 第三方用户界面控件 有助于保持一致性。

    我用它做的 DevExpress 控制。他们有一个很好的剥皮功能。

    我个人不喜欢不尊重操作系统外观设置的应用程序。

    别忘了,使用标准的.NET用户界面控件可以充分利用新的操作系统功能。如图所示,尝试在Windows XP、Windows Vista和Windows 7上使用标准ProgressBar控件的应用程序。

    推荐文章