2011-08-18 61 views
1

我已經使用MVVM模式創建了一個WPF桌面應用程序。作爲這項工作的一部分,我創建了一個包含許多對話窗口的命名空間,dialogViewModels和dialogViews。對話框窗口通常顯示其中一個dialogViews,具體取決於所分配的dialogViewModel。我想重用一個WPF UserControls庫 - 如何設置樣式?

我現在想要這個命名空間中的意見和的ViewModels轉換爲一個單獨的庫,這樣我就可以重新使用在其他應用程序的對話框。但是,我有兩個問題:

  1. 如何在我的usercontrols上設置樣式,以便在不同的應用程序中使用庫時,它會使用該應用程序中的樣式。
  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是關於使用StandardBorderStyleStandardButtonStyle。這些樣式目前在我的App.xaml文件中的<Application.Resources>下定義。如果我把對話在圖書館,我引用該庫從一個新的應用程序,我如何才能獲得使用StandardBorderStyleStandardButtonStyle對話框從的應用程序,這樣每個應用程序可以定義它自己的視覺風格?

問題2是關於DataTemplates。這些模板用於根據分配給Dialog的DataContext的ViewModel的類型,爲對話框(在上例中插入爲ContentControl元素)選擇適當的視圖。在我想使用與不同的查看方式時,我能否在重新使用庫時覆蓋上面的DataTemplate?

哦,我知道這是兩個問題,但你仍然只會得到名聲一個答案,對不起! ;-)

回答

0

對於樣式,我能想到的最好方法是在您自己的UserControl中爲每個樣式定義一個DependencyProperty。例如,您將擁有一個名爲BorderStyleDependencyProperty,您可以將默認設置爲您在控件庫中定義爲internaly的樣式,同時仍允許使用您的控件的客戶端代碼以他們想要的方式覆蓋此樣式。

對於DataTemplate,你不會真的做任何事情,因爲你的庫的用戶可以定義一個又一個DataTemplate(例如用於MessageBoxDialogViewModel)在他的代碼,這將優先考慮和用來代替的默認一個。

希望這會有所幫助:)

相關問題