Я хочу повторно использовать библиотеку пользовательских элементов управления WPF. Как установить стили? - PullRequest
2 голосов
/ 18 августа 2011

Я создал настольное приложение WPF, используя шаблон MVVM.В рамках этой работы я создал пространство имен со многими диалоговыми окнами, dialogViewModels и dialogViews.Диалоговые окна обычно отображают один из диалоговых представлений, в зависимости от назначенного dialogViewModel.

Теперь я хочу преобразовать виды и модели представления в этом пространстве имен в отдельную библиотеку, чтобы я мог повторно использовать диалоги в других приложениях.Однако у меня есть два вопроса:

  1. Как мне установить стили в моих пользовательских элементах управления, чтобы при использовании библиотеки в другом приложении использовались стили из этого приложения.
  2. Смогу ли я переопределить назначения таблицы данных, сделанные в элементах управления библиотеки, при повторном использовании библиотеки?

Какой-то код, иллюстрирующий мою точку зрения:

<Window x:Class="FeehandlerMain.Dialogs.OKDialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="{Binding Path=DialogTitle}"
        Height="200" Width="400" ResizeMode="NoResize" ShowInTaskbar="False" Topmost="True" WindowStartupLocation="CenterOwner" SizeToContent="Height">

    <Window.Resources>
        <DataTemplate DataType="{x:Type dialogs:MessageBoxDialogViewModel}">
            <dialogs:MessageBoxDialogView /> 
        </DataTemplate>                           
    </Window.Resources>        

    <Border Style="{StaticResource StandardBorderStyle}" >
        <Grid Margin="5">
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>

            <ContentControl Content="{Binding}"                   
                            Grid.Column="0" Grid.Row="0"  />

            <StackPanel Orientation="Horizontal"
                        Grid.Column="0" Grid.Row="1">
                <Button Content="OK" IsDefault="True" IsCancel="True"
                        Style="{StaticResource StandardButtonStyle}"/>
            </StackPanel>           
        </Grid>
    </Border>
</Window>

Вопрос 1 касается использования StandardBorderStyle и StandardButtonStyle.Эти стили в настоящее время определены в моем файле App.xaml в <Application.Resources>.Если я помещаю диалоговые окна в библиотеку и ссылаюсь на эту библиотеку из нового приложения, как я могу получить диалог для использования StandardBorderStyle и StandardButtonStyle из приложения new , чтобы каждое приложение моглоопределить свой собственный визуальный стиль?

Вопрос 2 касается DataTemplates.Эти шаблоны используются для выбора соответствующего представления для диалога (вставленного в качестве элемента ContentControl в примере выше) на основе типа ViewModel, назначенного в качестве DataContext диалога.Смогу ли я переопределить вышеуказанный DataTemplate при повторном использовании библиотеки, в сценарии, где я хочу использовать представление, отличное от MessageBoxDialogView для MessageBoxDialogViewModel?

О, и я знаю, что это два вопроса, но вывсе равно просто получит репутацию за один ответ, извините!; -)

1 Ответ

0 голосов
/ 18 августа 2011

Для стилей лучший способ, который я могу придумать, - это определить DependencyProperty для каждого из них в своем собственном UserControl.Таким образом, у вас будет, например, DependencyProperty с именем BorderStyle, для которого вы устанавливаете значение по умолчанию для стиля, который вы определяете внутри вашей управляющей библиотеки, и в то же время позволяете клиентскому коду, используя ваш элемент управления, переопределять этот стиль так, как они хотят.

Для DataTemplate вам на самом деле ничего не нужно делать, поскольку пользователь вашей библиотеки может определить в своем коде еще один DataTemplate (например, для MessageBoxDialogViewModel), и этобудет иметь приоритет и будет использоваться вместо значения по умолчанию.

Надеюсь, это поможет:)

...