次のように、ハイパーリンクを含むボタンがあります。
<Button IsEnabled="False">
<Hyperlink IsEnabled="True">Testing</Hyperlink>
</Button>
ハイパーリンクを有効にする必要がありますが、ボタンは無効にする必要があります。どうすればこれを達成できますか?
上記では、両方のコントロールが無効になるだけです。
次のように、ハイパーリンクを含むボタンがあります。
<Button IsEnabled="False">
<Hyperlink IsEnabled="True">Testing</Hyperlink>
</Button>
ハイパーリンクを有効にする必要がありますが、ボタンは無効にする必要があります。どうすればこれを達成できますか?
上記では、両方のコントロールが無効になるだけです。
コントロールHyperlink
は奇妙なプロパティを持っていますIsEnabled
。あなたが言及したもの、つまり親からの完全な値の継承に加えて、別の同様のものがあります。
Hyperlink
オフ ( IsEnabled="False"
) になっている特定のコントロールについては、設定 ( ) してもプロパティIsEnabled="True"
は更新されません。解決策 - (詳細Hyperlink
)の相対ソースを使用します。Hyperlink
あなたの質問を解決するために、それは標準的な解決方法ではないと判断しました。そこでClass
、独自の依存関係プロパティを持つ を作成しました。プロパティMyIsEnabled
と を持っていますMyStyle
。タイトルから推測できるように、最初の例ではプロパティIsEnabled
を設定しMyStyle
、動作をシミュレートしてボタン スタイルを指定する必要がありますIsEnabled="False"
。
SimulateDisable Style
<Style x:Key="SimulateDisable" TargetType="{x:Type Button}">
<Setter Property="Opacity" Value="0.5" />
<Setter Property="Background" Value="Gainsboro" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border CornerRadius="4" BorderThickness="1" BorderBrush="DarkBlue" SnapsToDevicePixels="True">
<ContentPresenter x:Name="MyContentPresenter" Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Button
あなたのプロパティで定義します:
<Button Name="MyButton" local:MyClass.MyIsEnabled="False" local:MyClass.MyStyle="{StaticResource SimulateDisable}" Width="100" Height="30" Click="Button_Click">
<Hyperlink IsEnabled="True" Click="Hyperlink_Click">Testing</Hyperlink>
</Button>
Listing of MyClass
public class MyClass : DependencyObject
{
public static readonly DependencyProperty MyIsEnabledProperty;
public static readonly DependencyProperty MyStyleProperty;
#region MyIsEnabled
public static void SetMyIsEnabled(DependencyObject DepObject, bool value)
{
DepObject.SetValue(MyIsEnabledProperty, value);
}
public static bool GetMyIsEnabled(DependencyObject DepObject)
{
return (bool)DepObject.GetValue(MyIsEnabledProperty);
}
#endregion MyIsEnabled
#region MyStyle
public static void SetMyStyle(DependencyObject DepObject, Style value)
{
DepObject.SetValue(MyStyleProperty, value);
}
public static Style GetMyStyle(DependencyObject DepObject)
{
return (Style)DepObject.GetValue(MyStyleProperty);
}
#endregion MyStyle
static MyClass()
{
MyIsEnabledProperty = DependencyProperty.RegisterAttached("MyIsEnabled",
typeof(bool),
typeof(MyClass),
new UIPropertyMetadata(false, OnPropertyChanged));
MyStyleProperty = DependencyProperty.RegisterAttached("MyStyle",
typeof(Style),
typeof(MyClass),
new UIPropertyMetadata(OnPropertyChanged));
}
private static void OnPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
Button MyButton = sender as Button;
bool MyBool = GetMyIsEnabled(MyButton);
if (MyBool == false)
{
MyButton.Style = MyClass.GetMyStyle(MyButton);
}
}
}
イベントが次に発生しないように、イベントをHyperlink
指すプラス。e.Handled = true
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Hyperlink Click!");
e.Handled = true;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Button Click! Don't show it's!");
}
Output
PS 回答が遅くなって申し訳ありません:)。