我非常新的WPF(使用了它3周)的價值,所以我可能會丟失一些愚蠢或不理解我在做什麼!WPF在用戶控件設置控件模板的內容對DependencyProperty
我試圖創建一個能夠覆蓋或者整個應用程序或電流控制是在模式類型彈出窗口。我想這種控制是半透明,因此用戶仍然可以看到後面的內容,但不能用它。然後,他們將能夠在繼續之前完成模態窗口中的任何事情。
我不希望有在不同的地方重複代碼,所以我的目標是有一個通用的控制,我可以在我的XAML中使用,只需要添加每次我需要的內容。即褪色,透明度,背景顏色額外的在一個地方的所有處理,我只需要添加特定功能的它該實例。
到目前爲止,我已經創建了一個名爲jonblind用戶控件:
<UserControl x:Class="ShapInteractiveClient.View.SampleTests.jonblind"
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"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid x:Name="blindGrid" Grid.RowSpan="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Opacity="0.82">
<Grid.Background>
<LinearGradientBrush EndPoint="0,1" StartPoint="0,0" MappingMode="RelativeToBoundingBox">
<GradientStop Color="#FFA8CBFE" Offset="1"/>
<GradientStop Color="Red"/>
<GradientStop Color="#FFE1EDFE" Offset="0.147"/>
</LinearGradientBrush>
</Grid.Background>
<ContentControl x:Name="contentTemplateArea" />
</Grid>
</UserControl>
我有一個代碼背後的控制如下:
public partial class jonblind : UserControl
{
public jonblind()
{
InitializeComponent();
SetVisibility(this);
}
[Category("jonblind")]
public bool IsContentVisible
{
get { return (bool)GetValue(IsContentVisibleProperty); }
set { SetValue(IsContentVisibleProperty, value); }
}
public static readonly DependencyProperty IsContentVisibleProperty = DependencyProperty.Register("IsContentVisible", typeof(bool), typeof(jonblind),
new FrameworkPropertyMetadata(new PropertyChangedCallback(OnIsOverlayContentVisibleChanged)));
private static void OnIsOverlayContentVisibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
jonblind blind = d as jonblind;
if(blind != null)
SetVisibility(blind);
}
private static void SetVisibility(jonblind blind)
{
blind.blindGrid.Visibility = blind.IsContentVisible ? Visibility.Visible : Visibility.Hidden;
}
[Category("jonblind")]
public ContentControl ContentAreaControl
{
get { return (ContentControl)GetValue(ContentAreaControlProperty); }
set { SetValue(ContentAreaControlProperty, value); }
}
public static readonly DependencyProperty ContentAreaControlProperty = DependencyProperty.Register("ContentAreaControl", typeof(ContentControl), typeof(jonblind),
new FrameworkPropertyMetadata(new PropertyChangedCallback(OnContentAreaControlChanged)));
private static void OnContentAreaControlChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
jonblind blind = d as jonblind;
if (blind != null && e.NewValue != null && e.NewValue is ContentControl)
{
blind.contentTemplateArea = e.NewValue as ContentControl;
}
}
}
我可以如下把它添加到其他用戶控件:
<UserControl.Resources>
<ContentControl x:Key="testcontrol">
<StackPanel>
<TextBox VerticalAlignment="Center" HorizontalAlignment="Center" Text="Loading!!!" />
<Button Content="hide me!" Command="{Binding Path=alternateblind}" />
</StackPanel>
</ContentControl>
</UserControl.Resources>
<SampleTests:jonblind IsContentVisible="{Binding Path=ShowBlind}" ContentAreaControl="{StaticResource testcontrol}" />
如果我把一個斷點放在「OnContentAreaControlChanged」上,我可以看到新內容被傳入,但不會在運行時顯示。
我不知道如果我要對此都錯了,如果它甚至有可能,如果它只是需要tweeking。任何和所有這方面的意見和處理這種情況將不勝感激。
兩個答案都很有意思,明天都會試試。謝謝 – Jon 2011-03-24 21:34:23