我正在开发一个Windows应用程序并使用NuGet版本1.5.0中的MahApps.Metro
。我遇到了一个问题,设置全局属性会导致文本框消失。以下是重现的步骤:
MahApps.Metro
MahApps.Metro
Controls:TextBoxHelper.Watermark="<watermark here>"
)。以下是我的示例应用的.xaml。请注意,我已将Controls
更改为mah
(无所谓;我尝试Controls
和mah
没有区别对待:
<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。
答案 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>
<强>结果:强>
答案 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>
希望这有帮助!