7

次のように、ハイパーリンクを含むボタンがあります。

<Button IsEnabled="False">
    <Hyperlink IsEnabled="True">Testing</Hyperlink>
</Button>

ハイパーリンクを有効にする必要がありますが、ボタンは無効にする必要があります。どうすればこれを達成できますか?

上記では、両方のコントロールが無効になるだけです。

4

2 に答える 2

0

コントロール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 回答が遅くなって申し訳ありません:)。

于 2013-07-15T16:26:17.450 に答える