WPF自定义窗口在设计时不应用其通用模板

时间:2014-08-30 18:58:24

标签: c# wpf xaml controls design-time

我创建了一个简单的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,   本

2 个答案:

答案 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 (抱歉英语)