Задать внешний вид пользовательского окна по умолчанию в WPF? - PullRequest
5 голосов
/ 06 июля 2011

Я хотел бы создать библиотеку некоторых из моих обычно используемых элементов управления WPF, и одним из этих элементов управления является CustomWindow, который наследуется от класса Window. Как я могу заставить мой CustomWindow использовать внешний вид по умолчанию, который определен в библиотеке вместе с ним?

Я могу заменить

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

с

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

и это работает для поведения окна, но не для внешнего вида.

EDIT

Вот упрощенная версия того, что я имею до сих пор:

Пользовательское управление окнами. Расположен в библиотеке управления.

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

Стиль окна. Расположен в Generic.xaml, ResourceDictionary в папке Темы библиотеки элементов управления

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

Тестовое окно. Окно запуска отдельного проекта, который ссылается на управляющую библиотеку

<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>

Я получаю окно с обычным WindowStyle и черным фоном.

Ответы [ 3 ]

2 голосов
/ 06 июля 2011

Используйте это 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>

Возможно, вы захотите создать новую тему для окна. Если это так, поместите следующую тему в (вашу библиотеку) файл ресурсов \ Themes \ Generic.xaml:

<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>
1 голос
/ 07 июля 2011

Попробуйте добавить это в файл AssemblyInfo.cs в вашей библиотеке классов

[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)
)]
0 голосов
/ 06 июля 2011

Как насчет этого (поместите это в Cctor по умолчанию):

 DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomWindow)
                                             , new FrameworkPropertyMetadata(typeof(CustomWindow)));`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...