我创建了一个简单的WPF自定义控件,它继承自Window,以便稍后我能够覆盖它的chrome并在我的项目中重用它。该控件包含在自己的项目中,并包含 generic.xaml 文件(在主题目录中)。控件的样式只是设置一个红色背景。在第二个项目(相同的解决方案)中,我然后使用控件作为新WPF窗口的基类。当我现在编译项目并让它运行时,它会显示我所需的红色背景的自定义窗口。
我的问题是:如何让 WPF设计师在设计时显示通用样式(在本例中为红色背景)?
当我使用按钮执行相同操作时,会自动在设计时应用通用样式。但是,从Window继承的任何默认控件样式都只会在运行时显示。我错过了什么?
控制代码:
public class CustomControl1 : Window
{
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
}
}
generic.xaml:
<Style TargetType="{x:Type local:CustomControl1}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl1}">
<Border Background="Red"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我使用控件的第二个项目中的测试窗口的XAML:
<snh:CustomControl1 x:Class="WpfDockWindow.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:snh="clr-namespace:SnH.WpfControls;assembly=SnH.WpfControls"
Title="TestWindow" Height="300" Width="300">
<Grid>
</Grid>
对于记录,我使用VS2013,项目使用框架4.5.1编译。
THX, 本
答案 0 :(得分:0)
尝试不同的方法怎么样?不要从Window
继承自定义控件,而是尝试从ContentControl
继承自定义控件,然后在常规Window
内将其用作顶级控件并定义其内容。
自定义控件应该看起来像
namespace ProjectBar.Controls
{
public class CustomControl : ContentControl
{
static CustomControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl)));
}
}
}
现在让我们在ProjectBar \ Themes \ Generic.xaml
中定义默认控件模板<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:ProjectBar.Controls">
<Style TargetType="{x:Type controls:CustomControl}">
<Setter Property="Background" Value="Red"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type controls:CustomControl}">
<Grid Margin="5" Background="{TemplateBinding Background}">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!--Define the ContentPresenter. This is the place where the Content goes-->
<ContentPresenter Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<!--Place the OK and Cancel buttons-->
<StackPanel Orientation="Horizontal" FlowDirection="RightToLeft" Grid.Row="1" >
<Button Content="Cancel" HorizontalAlignment="Right" Width="60" />
<Button Content="OK" HorizontalAlignment="Right" Width="60" />
</StackPanel>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
ProjectFoo中的用法
<Window x:Class="ProjectFoo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:ProjectBar.Controls;assembly=ProjectBar"
Title="MainWindow" Height="200" Width="300">
<controls:CustomControl>
<Label>Place anything here</Label>
</controls:CustomControl>
</Window>
但是我知道,你不喜欢红色,让我们在App.xaml文件的ProjectFoo中更改它
<Application x:Class="ProjectFoo.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:ProjectBar.Controls;assembly=ProjectBar"
StartupUri="MainWindow.xaml">
<Application.Resources>
<Style TargetType="{x:Type controls:CustomControl}">
<Setter Property="Background" Value="Green"/>
</Style>
</Application.Resources>
</Application>
编辑: 还要确保在ProjectBar AssemblyInfo.cs中添加此行
[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
答案 1 :(得分:0)
我花了很多时间尝试解决这个问题。
答案是: ----&GT;将参考项目(控制项目)和消费项目的平台设置更改为任何Cpu
如果&#34;控制项目&#34;设置为&#34;任何Cpu&#34;而你正试图在&#34;消费项目&#34;作为x64,问题出现了。 The Correct Configuration (抱歉英语)