在UI设计方面,我通常不关心自定义样式(外观方面),我不是一个艺术家,我讨厌尝试提出有趣的配色方案等.是否有任何预制WPF样式和/或控件模板的在线存储库?我可以发誓我之前看过一个,但我现在找不到它,它可能会消失.
只是好奇你们是否知道这样的事情.能够将预制样式放入我的应用程序中以使其更加美观,真是太棒了.
我在ResourceDictionary xaml文件中有一个Canvas,如下所示:
<Canvas x:Key="Icon">
<Path ... />
<Path ... />
</Canvas>
Run Code Online (Sandbox Code Playgroud)
在我的代码隐藏中,我使用加载此图标
LayoutGrid.Children.Add(FindResource("Icon") as Canvas);
Run Code Online (Sandbox Code Playgroud)
这很好用.现在我想创建一个使用相同图标作为模板的按钮.所以我创建了一个控件模板:
<ControlTemplate x:Key="IconTemplate">
...
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
现在问题是:如何将"Icon"资源画布放入控件模板?据我所知,Canvas没有Style或Template属性.它有一个儿童酒店,但无法通过XAML访问.我如何在模板中使用我的画布?
我正在使用WPF编写应用程序,其中一部分涉及为用户管理各种文件,这些文件用于配置自定义的内部设备.我需要能够在同一个TabControl中的选项卡中操作不同类型的配置,这意味着必须动态生成TabItems的内容.我想用ControlTemplates做到这一点,但我还没有成功获得一个工作模板.我在我的Window资源中定义了一个名为"pendantConfigurationTabItemTemplate"的ControlTemplate,我使用以下代码将模板(包含我需要访问的命名项)应用到TabItems并将它们添加到它们的父TabControl:
<ControlTemplate x:Key="pendantConfigurationTabItemTemplate" TargetType="TabItem">
<StackPanel Orientation="Vertical">
<my:PendantConfigurationFileEditor x:Name="configurationEditor"/>
<StackPanel Style="{StaticResource defaultOkCancelButtonsContainerStyle}">
<Button Style="{StaticResource defaultOkCancelButtonStyle}"/>
<Button Style="{StaticResource defaultOkCancelButtonStyle}" Click="OkButton_Click"/>
</StackPanel>
</StackPanel>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
代码背后:
TabItem ConfigTab = new TabItem();
switch (ConfigFile.Device)
{
case DeviceType.PENDANT:
{
ControlTemplate TabTemplate = Resources["pendantConfigurationTabItemTemplate"] as ControlTemplate;
ConfigTab.Template = TabTemplate;
ConfigTab.ApplyTemplate();
object Editor = TabTemplate.FindName("configurationEditor", ConfigTab);
PendantConfigurationFileEditor ConfigFileEditor = Editor as PendantConfigurationFileEditor;
ConfigFileEditor.PendantConfiguration = DeviceConfig;
break;
}
default:
/* snipped */
return;
}
ConfigTab.Header = ConfigFile.ConfigurationName;
this.EditorTabs.Items.Add(ConfigTab);
this.EditorTabs.SelectedIndex = this.EditorTabs.Items.Count - 1;
Run Code Online (Sandbox Code Playgroud)
但是,每当我运行程序时,没有选项卡添加到选项卡控件,而是选项卡控件(看似)被模板内容替换或覆盖.有人可以帮我解决这个问题吗?
实际上,我想要做的是将WPF模板用作TabItem工厂
以下是它现在的样子:

我希望ComboBoxItems的宽度与ComboBox.我已经覆盖了ComboBox和的默认模板ComboBoxItem.
ComboBoxItem风格:
<Style x:Key="{x:Type ComboBoxItem}"
TargetType="{x:Type ComboBoxItem}">
<Setter Property="SnapsToDevicePixels"
Value="true" />
<Setter Property="OverridesDefaultStyle"
Value="true" />
<Setter Property="FocusVisualStyle"
Value="{x:Null}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBoxItem}">
<Border Name="Border"
Padding="2"
SnapsToDevicePixels="true">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsHighlighted"
Value="true">
<Setter TargetName="Border"
Property="Background"
Value="#9982B5D8" />
</Trigger>
<Trigger Property="IsEnabled"
Value="false">
<Setter Property="Foreground"
Value="#888888" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
ComboBox 样式:
<Style x:Key="{x:Type ComboBox}"
TargetType="{x:Type ComboBox}">
<Setter Property="SnapsToDevicePixels"
Value="true" />
<Setter Property="OverridesDefaultStyle"
Value="true" /> …Run Code Online (Sandbox Code Playgroud) 这可能是一个愚蠢的问题(我真的是 WPF 的新手),但是在 Visual Studio 的 Xaml 编辑器中覆盖控件外观时,是否有一种简单的方法可以自动发现可用的模板部分 (PART_*)?
我知道我可以使用 Reflector 之类的工具或查看文档。我在这里寻找的是效率。当然,某处必须有一个上下文的、类似智能感知的帮助程序,当我在编辑器的上下文菜单中键入或单击按钮时,它会显示可用的 TemplatePart 详细信息?我不可能是唯一一个觉得它有用的人?!
在用户界面上切换时,大多数WPF控件在接收到键盘焦点时会显示一个虚线边框。用鼠标单击它们时,它们不会显示此边框。
我有一个带有自定义控件模板的按钮,并且我希望具有与上述相同的行为,但是我不仅要添加边框,还想修改按钮本身的外观。
自定义FocusVisualStyle。这没有给我足够的灵活性,因为由设置的模板FocusVisualStyle已添加到按钮的顶部。据我所知,这不能用于以任何方式修改(样式,动画,...)按钮本身。
使用带有IsFocused和/或IsKeyboardFocused属性的触发器以及带有Got/LostFocus和/或Got/LostKeyboardFocus事件的EventTriggers 对按钮进行样式设置。这也不起作用,因为当我也单击按钮时,所有这些似乎都被触发了。
<StackPanel VerticalAlignment="Center" Width="150">
<StackPanel.Resources>
<ControlTemplate x:Key="CustomButtonTemplate" TargetType="Button">
<!--A simple black border with a content presenter-->
<Border BorderBrush="Black" BorderThickness="1" CornerRadius="2">
<ContentPresenter x:Name="Presenter" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" />
</Border>
<ControlTemplate.Triggers>
<!--When receiving keyboard focus modify the button text-->
<Trigger Property="IsKeyboardFocused" Value="True">
<Setter TargetName="Presenter" Property="Content" Value="I have keyboard focus" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style x:Key="CustomFocusVisualStyle" TargetType="Control">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate> …Run Code Online (Sandbox Code Playgroud) 我在 .Net MAUI 中设置单选按钮样式时遇到了一些问题。最初,我注意到 Windows 和 Android 上的单选按钮外观并不一致,如下图所示:
它们不仅不同,而且按钮样式的可用选项也很有限。定义颜色的唯一选项是“BorderColor”、“BackgroundColor”和“TextColor”。“BorderColor”和“BackgroundColor”对单选按钮本身的颜色完全没有影响。我想更改实际单选按钮的颜色。
所以我决定创建一个控制模板来帮助我。这是我的控件模板:
<ControlTemplate x:Key="RadioButtonTemplate">
<Border Stroke="Transparent" BackgroundColor="Transparent">
<VisualStateManager.VisualStateGroups>
<VisualStateGroupList>
<VisualStateGroup x:Name="CheckedStates">
<VisualState x:Name="Checked">
<VisualState.Setters>
<Setter TargetName="check" Property="Opacity" Value="1" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Unchecked">
<VisualState.Setters>
<Setter TargetName="check" Property="Opacity" Value="0" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</VisualStateManager.VisualStateGroups>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid WidthRequest="20" HeightRequest="20" Grid.Column="0" VerticalOptions="Center" HorizontalOptions="Center">
<Ellipse x:Name="border_circle" StrokeThickness="2" Stroke="DarkBlue" Fill="White" WidthRequest="18" HeightRequest="18" HorizontalOptions="Center" VerticalOptions="Center" />
<Ellipse x:Name="check" Fill="DarkBlue" WidthRequest="10" HeightRequest="10" HorizontalOptions="Center" VerticalOptions="Center" />
</Grid>
<ContentPresenter Margin="10,0,0,0" Grid.Column="1" HorizontalOptions="Start" …Run Code Online (Sandbox Code Playgroud) 我创建了一个附加属性来扩展具有附加状态的Button类:
<Button v:ExtensionHelper.OperationMode="{Binding MyObject.OperationMode}"
Command="{Binding MyObject.Select}"
Style="{StaticResource operationModeControlTemplateStyle}" />
Run Code Online (Sandbox Code Playgroud)
然后,我想在访问此值,ControlTemplate使用DataTrigger这样的:
<Style x:Key="operationModeControlTemplateStyle" TargetType="Button">
<Setter Property="IsHitTestVisible" Value="true" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Image x:Name="hand" Source="hand.png" />
<Image x:Name="cross" Source="cross.png" />
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding Path=(v:ExtensionHelper.OperationMode), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" Value="Manual">
<Setter TargetName="cross" Property="Visibility" Value="Collapsed" />
<Setter TargetName="hand" Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=(v:ExtensionHelper.OperationMode), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" Value="Disabled">
<Setter TargetName="cross" Property="Visibility" Value="Visible" />
<Setter TargetName="hand" Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=(v:ExtensionHelper.OperationMode), RelativeSource={RelativeSource FindAncestor, …Run Code Online (Sandbox Code Playgroud) data-binding wpf datatrigger controltemplate attached-properties
我为Button创建了一个默认样式,包括一个自定义ControlTemplate,如下所示:
<Style TargetType="{x:Type Button}">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Background" Value="White"/>
<Setter Property="BorderBrush" Value="Black"/>
<!-- ...other property setters... -->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid x:Name="gridMain">
<!-- some content here -->
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
此样式将添加到我的共享ResourceDictionary中,该ResourceDictionary由每个控件加载.现在,这个样式/模板按预期应用于我的所有按钮,但它不适用于本地使用不同样式的那些按钮.例如,我希望我的"确定","应用"和"取消"按钮有一定的余量.因此,我定义了以下样式:
<Style x:Key="OKApplyCancelStyle" TargetType="{x:Type Button}">
<Setter Property="Margin" Value="4,8"/>
<Setter Property="Padding" Value="8,6"/>
<Setter Property="MinWidth" Value="100"/>
<Setter Property="FontSize" Value="16"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
...并使用StaticResource将该样式应用于我的按钮:
<Button Content="OK" Style="{StaticResource OKApplyCancelStyle}"/>
Run Code Online (Sandbox Code Playgroud)
对我来说,预期的结果是仍然会应用上面的ControlTemplate,使用"OKApplyCancelStyle"中的Margin,Padding,MinWidth和FontSize的值.但这种情况并非如此.使用默认的Windows ControlTemplate,使用样式中的值.
这是典型的行为吗?本地样式是否真的覆盖自定义ControlTemplate?如果是这样,我怎样才能实现我想要的行为?即使在本地定义样式,即使仍然使用我的自定义ControlTemplate?
非常感谢,gehho.
运行我的应用程序时,我在控制台中收到此错误:
System.Windows.Data Error: 17 : Cannot get 'Item[]' value (type 'ValidationError') from '(Validation.Errors)' (type 'ReadOnlyObservableCollection`1'). BindingExpression:Path=AdornedElement.(0)[0].ErrorContent; DataItem='AdornedElementPlaceholder' (Name='placeholder'); target element is 'TextBlock' (Name=''); target property is 'ToolTip' (type 'Object') ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: index'
A first chance exception of type 'NHibernate.Validator.Exceptions.ValidatorConfigurationException' occurred in NHibernate.Validator.dll
Run Code Online (Sandbox Code Playgroud)
我不明白的其中一个问题是应用程序行为很好,单元测试也是如此.
我(显然)在IDataErrorInfo实现的幕后使用了NHibernate验证器,但最重要的是IDataErrorInfo.Error和IDataErrorInfo [columnName]如果有错误将返回单个字符串,如果没有则返回null .
我猜这个异常是因为当没有错误时,没有索引,但是我的错误工具提示的绑定似乎是关于如何做的典型例子.
我的错误模板的绑定如下.
问题:
带有错误模板的文本框样式:
<Style TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="0,0,16,0" />
<!-- Error display -->
<Setter Property="Validation.ErrorTemplate">
<Setter.Value> …Run Code Online (Sandbox Code Playgroud) controltemplate ×10
wpf ×9
.net ×2
data-binding ×2
styles ×2
xaml ×2
c# ×1
canvas ×1
combobox ×1
datatrigger ×1
maui ×1
radio-button ×1
tabcontrol ×1
tabitem ×1
templates ×1
validation ×1