2 つの依存関係プロパティを公開するカスタム ユーザー コントロールがIsBusy
ありBusyText
ます。
私が欲しいのは、IsBusy が true に設定されているときにコントロールが表示されるようにすることです... ユーザー コントロールの xaml は次のとおりです。
<UserControl x:Class="MyNamespace.BusyDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:MyNamespace"
Height="Auto"
Width="Auto"
x:Name="busyControl">
<Grid Panel.ZIndex="10">
<Border Opacity=".2">
<Border.Background>
<RadialGradientBrush>
<GradientStop Color="#FF000000" Offset="0.59"/>
<GradientStop Color="#FFB6B6B6" Offset="0"/>
</RadialGradientBrush>
</Border.Background>
</Border>
<Border VerticalAlignment="Center"
HorizontalAlignment="Center"
BorderThickness="2"
BorderBrush="Gray">
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType=controls:BusyDialog},
Path=BusyText}"
Opacity="1"
Margin="20,10,20,10"/>
</Border>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType=controls:BusyDialog},Path=IsBusy}" Value="True">
<Setter Property="Opacity" Value=".3" />
<Setter Property="IsEnabled" Value="False" />
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>
ここにコードビハインドがあります
public partial class BusyDialog : UserControl
{
#region Dependency Properties
public string BusyText
{
get { return (string)GetValue(BusyTextProperty); }
set { SetValue(BusyTextProperty, value); }
}
public bool IsBusy
{
get{ return (bool)GetValue(IsBusyProperty); }
set { SetValue(IsBusyProperty, value); }
}
public static readonly DependencyProperty IsBusyProperty =
DependencyProperty.Register(
"IsBusy",
typeof(bool),
typeof(BusyControl),
new FrameworkPropertyMetadata(
false,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static readonly DependencyProperty BusyTextProperty =
DependencyProperty.Register(
"BusyText",
typeof(string),
typeof(BusyControl),
new FrameworkPropertyMetadata(
string.Empty,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
#endregion
public BusyDialog ()
{
InitializeComponent();
}
}
これが私のビューでユーザーコントロールを作成しています:
<localControls:BusyDialog x:Name="busyControl"
Grid.Row="0"
IsBusy="{Binding IsWorking}"
BusyText="{Binding WorkingText}">
</localControls:BusyDialog>
私のコードに何か問題がありますか? ViewModel で IsWorking プロパティを設定すると、コントロールが想定どおりに表示されません。
また、次のようにユーザー コントロール バインディングを設定しようとしました。
<UserControl x:Class="MyNamespace.BusyDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:MyNamespace"
Height="Auto"
Width="Auto"
x:Name="busyControl">
<Grid Panel.ZIndex="10">
<Border Opacity=".2">
<Border.Background>
<RadialGradientBrush>
<GradientStop Color="#FF000000" Offset="0.59"/>
<GradientStop Color="#FFB6B6B6" Offset="0"/>
</RadialGradientBrush>
</Border.Background>
</Border>
<Border VerticalAlignment="Center"
HorizontalAlignment="Center"
BorderThickness="2"
BorderBrush="Gray">
<TextBlock Text="{Binding ElementName=busyControl, Path=BusyText}"
Opacity="1"
Margin="20,10,20,10"/>
</Border>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=busyControl,Path=IsBusy}" Value="True">
<Setter Property="Opacity" Value=".3" />
<Setter Property="IsEnabled" Value="False" />
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>