2013-01-14 69 views
3

我試圖創建WPF/XAML一個「標題塊」用戶控件,具有以下行爲:用XAML創建WPF用戶控件,這樣我可以窩兒控制內部

  • 控制本身是包含邊界一個DockPanel。 DockPanel包含一個頂部對齊的「標題」TextBlock,該DockPanel的其餘部分應該是「子部件區域」。

控制的聲明是這樣的:

<Border x:Name="LayoutRoot" Background="#4C000000" CornerRadius="10" Padding="10"> 
    <DockPanel> 
     <TextBlock Text="Some Title" DockPanel.Dock="Top" /> 
    </DockPanel> 
</Border> 

和預期使用情況是這樣的:

<Grid x:Name="LayoutRoot" Background="White"> 
    <local:Bloco Height="100" Width="100" Title="Other Title"> 
     <local:Bloco Title="Yet other title" /> 
    </local:Bloco> 
</Grid> 

爲了使這樣的事情:

enter image description here

實際上 但是,當前的渲染無效。這些問題是:

  • 我不知道(並通過搜索沒有找到它)如何使控制有一個「孩子容器」,在那裏我可以通過在XAML直接嵌套增加兒童;
  • 我不知道如何爲用戶控件的每個實例綁定不同的標題,無論是通過XAML屬性還是綁定(最喜歡),通過代碼隱藏。如上所述編寫代碼將創建無效的xaml代碼,這並不令人驚訝,因爲「Title」屬性尚不存在。

感謝您的閱讀!

回答

3
添加模板

一般用戶控件:

XAML:

<UserControl x:Class="WpfControlLibrary.GenericUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfControlLibrary" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" x:Name="Control"> 
<UserControl.Resources> 
    <Style TargetType="{x:Type local:GenericUserControl}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:GenericUserControl}"> 
        <Grid Background="{Binding Background, ElementName=Control}"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="5"></RowDefinition> 
          <RowDefinition Height="20"></RowDefinition> 
          <RowDefinition Height="*"></RowDefinition> 
          <RowDefinition Height="5"></RowDefinition> 
         </Grid.RowDefinitions> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="5"/> 
          <ColumnDefinition Width="*"/> 
          <ColumnDefinition Width="5"/> 
         </Grid.ColumnDefinitions> 
         <TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding Title, ElementName=Control}"/> 
         <ContentPresenter Grid.Column="1" Grid.Row="2"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 

後面的代碼:

namespace WpfControlLibrary 
{ 
    public partial class GenericUserControl 
    { 
     public string Title 
    { 
     get { return (string)GetValue(TitleProperty); } 
     set { SetValue(TitleProperty, value); } 
    } 

    public static readonly DependencyProperty TitleProperty = 
     DependencyProperty.Register("Title", typeof(string), typeof(GenericUserControl), new PropertyMetadata(string.Empty)); 

public GenericUserControl() 
    { 
     InitializeComponent(); 
    } 
    } 
} 

而不是使用用戶控件這樣的:

<wpfControlLibrary:GenericUserControl Title="Other Title" Background="LightGray"> 
     <wpfControlLibrary:GenericUserControl Title="Yet Another Title" Background="Gray"/> 
</wpfControlLibrary:GenericUserControl> 
+0

這來了八九不離十。標題工作正常,但ContentControl有兩個問題:1)在VisualStudio和ExpressionBlend中,嵌套內容(通常是其他小部件)在文檔大綱中不顯示爲可選子項。 2)XAML語法比我想象的要冗長一點(特別是''元素)。你能提出一個解決辦法嗎?現在感謝! – heltonbiker

+0

@ heltonbiker:請檢查編輯後的版本。現在它正確顯示在文檔大綱中。更好? – rhe1980

+0

明白了!我已經離開了XAML一段時間了,而這看起來像是正確的做法。感謝您的時間與興趣! – heltonbiker

4
  1. 您可以創建自ContentControl繼承控制和它
  2. 如果你想獲得在XAML的屬性,你需要把它註冊爲DependencyProperty的訪問您的自定義屬性(見enter link description here