开发者

Specifying a custom Window's default appearance in WPF?

I would like to make a library of some of my commonly used WPF controls, and one of these controls is a CustomWindow which inherits from the Window class. How can I get my CustomWindow to use a default appearance that is defined in the library with it?

I can replace

<Window x:Class="..." />

with

<MyControls:CustomWindow x:Class="..." />

and it works for the window behavior, but not the appearnce.

EDIT

Here is a simplified version of what I h开发者_JAVA技巧ave so far:

Custom Window Control. Located in the Control library.

public class CustomChromeWindow: Window
{
    static CustomChromeWindow()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomChromeWindow), 
            new FrameworkPropertyMetadata(typeof(CustomChromeWindow)));
    } 
}

Window Style. Located in a Generic.xaml, a ResourceDictionary in the Themes folder of the control library

<Style TargetType="local:CustomChromeWindow">
    <Setter Property="WindowStyle" Value="None" />
    <Setter Property="Background" Value="Red" />
</Style>

Test Window. Startup window of a separate project that references the control library

<local:CustomChromeWindow
    x:Class="MyControlsTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyControls;assembly=MyControls"
    Title="MainWindow" Height="350" Width="525"
    >
    <Grid>
        <TextBlock Text="This is a Test" />
    </Grid>
</local:CustomChromeWindow>

What I end up getting is a window with the regular WindowStyle and a black background.


Use this xaml:

<Window x:Class="MyNamespace.CustomWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:MyControls="MyNamespace">

    <Window.Style>
        <Style TargetType="MyControls:CustomWindow">
        ...
        </Style>
    </Window.Style>

    <ContentPresenter />

</Window>

You may want to design a new theme for the window. If so place following theme in (your library)\Themes\Generic.xaml resource file:

<Style TargetType="{x:Type MyControls:CustomWindow}">
    <Setter Property="WindowStyle" Value="None" />
    <Setter Property="AllowsTransparency" Value="True" />
    ...

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type MyControls:CustomWindow}">
                <Border>
                    ...
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>


Try adding this to the AssemblyInfo.cs file in your class library

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
    //(used if a resource is not found in the page, 
    // or application resource dictionaries)
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries)
)]


How about this (put this in the default Cctor) :

 DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomWindow)
                                             , new FrameworkPropertyMetadata(typeof(CustomWindow)));`
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜