将全局样式/事件应用于MahApps.Metro文本框会禁用水印

时间:2018-01-11 21:36:26

标签: wpf xaml mahapps.metro

我正在开发一个Windows应用程序并使用NuGet版本1.5.0中的MahApps.Metro。我遇到了一个问题,设置全局属性会导致文本框消失。以下是重现的步骤:

  1. 创建新的WPF应用程序
  2. 从NuGet(控制台或命令行)安装MahApps.Metro
  3. 配置App.xaml和MainWindow.xaml(和.cs)以处理MahApps.Metro
  4. 使用水印属性创建一个简单的文本框(默认为Controls:TextBoxHelper.Watermark="<watermark here>")。
  5. 运行应用程序。水印按预期显示。
  6. 以下是我的示例应用的.xaml。请注意,我已将Controls更改为mah(无所谓;我尝试Controlsmah没有区别对待:

    <mah:MetroWindow x:Class="MahAppsTest.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:mah="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
            xmlns:local="clr-namespace:MahAppsTest"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <TextBox mah:TextBoxHelper.Watermark="Test" Margin="5" VerticalAlignment="Top"/>
        </Grid>
    </mah:MetroWindow>
    

    现在,如果我进入App.xaml文件并添加以下内容:

    <Style TargetType="TextBox">
        <Setter Property="Margin" Value="5"/>
    </Style>
    

    从文本框中删除属性(或保留在那里,没关系)然后运行应用程序,水印现在消失了。它是<Setter>还是<EventSetter>并不重要。但水印显示在IDE中。

    我在他们的GitHub回购中看到了一些人通过将BasedOn="{StaticResource {x:Type TextBox}}"添加到<Style>标记来解决的问题,但这些似乎都应用于MainWindow.xaml或等效的而App.xaml文件中的全局。

    编辑:我还尝试在发帖前添加{x:Type ...}参数。

    有没有人经历过这个并知道修复?

    我在Windows 10上使用C#v4.6.1(根据目标框架)在Visual Studio 2017编程中运行MahApps.Metro v1.5.0。

2 个答案:

答案 0 :(得分:3)

您需要以MahApps风格为基础。如上所述,您将扩展默认 TextBox样式(没有水印)。试试这个:

<Style TargetType="TextBox"
       BasedOn="{StaticResource MetroTextBox}">
  <Setter Property="Margin" Value="5"/>
</Style>

认为会起作用。但是,您需要确保MahApps样式在您声明该资源的范围内。如果您将MahApps资源提取到App.xaml,那么请确保进一步宣布此样式。

如果由于某种原因这不起作用,请尝试将MetroTextBox替换为{x:Type TextBox}looks like MetroTextBox是样式名称,但我可能错了。

我不确定你的意思,但是:

  

配置App.xaml和MainWindow.xaml(和.cs)以处理MahApps.Metro

如果您的意思是将MahApps.Metro样式资源导入App.xaml MainWindow.xaml,那么这是不必要的。将它们放入App.xaml就足够了。

这就是我尝试过的,它对我有用:

<强> App.xaml中:

<Application x:Class="WpfTest.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
  <Application.Resources>
    <ResourceDictionary>

      <!-- MahApps.Metro Resource Imports -->
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/MahApps.Metro;component/Styles/Controls.xaml" />
        <ResourceDictionary Source="/MahApps.Metro;component/Styles/Fonts.xaml" />
        <ResourceDictionary Source="/MahApps.Metro;component/Styles/Colors.xaml" />
        <ResourceDictionary Source="/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
        <ResourceDictionary Source="/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
      </ResourceDictionary.MergedDictionaries>

      <!-- Global TextBox Style Override -->
      <Style TargetType="TextBox" BasedOn="{StaticResource MetroTextBox}">
        <Setter Property="Margin" Value="50" />
        <Setter Property="BorderBrush" Value="Crimson" />
      </Style>

    </ResourceDictionary>
  </Application.Resources>
</Application>

<强> MainWindow.xaml:

<m:MetroWindow x:Class="WpfTest.MainWindow"
               xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
               xmlns:m="http://metro.mahapps.com/winfx/xaml/controls"
               SizeToContent="WidthAndHeight">
  <TextBox m:TextBoxHelper.Watermark="Test" Width="300" />
</m:MetroWindow>

<强>结果:

Screenshot of TextBox with Global Style Applied

答案 1 :(得分:0)

我在没有MahApps的情况下测试了这个问题并且得到了相同的结果(在App.xaml中引用的ResourceDictionary中的基本样式)。

经过一些试验和错误后,我找到了一个可以使用和不使用MahApps的解决方案。

诀窍是在额外的ResourceDictionary中定义一个带有键的基本样式(也可以是一个单独的),并使用它来定义现在在任何地方使用的基本样式。

<Application x:Class="WpfApplication16.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!-- MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive! -->
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
                <!-- Accent and AppTheme setting -->
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />

                <ResourceDictionary>
                    <Style x:Key="BaseTextBoxStyle" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
                        <Setter Property="Background" Value="Goldenrod" />
                        <Setter Property="Margin" Value="5" />
                        <Setter Property="controls:TextBoxHelper.ClearTextButton" Value="True" />
                    </Style>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>

            <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource BaseTextBoxStyle}" />

        </ResourceDictionary>
    </Application.Resources>
</Application>

<强>示例

<Window x:Class="WpfApplication16.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

    <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center">

        <TextBox Margin="10" Text="Test" MinWidth="200" />

    </StackPanel>
</Window>

enter image description here

希望这有帮助!