我有一个包含超链接的按钮,如下所示:

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

我需要启用超链接,但是要禁用按钮。我怎样才能做到这一点?

以上只是导致两个控件都被禁用。

最佳答案

控件Hyperlink具有奇怪的IsEnabled属性。除了您提到的一个,即从父级继承完整值之外,还有另一个类似的问题。

特定控件的Hyperlink(已关闭(IsEnabled="False"),设置(IsEnabled="True"))不会更新Hyperlink属性。解决方案-使用Hyperlink的相对源(更多info)。

为了解决您的问题,我认为这不是解决问题的标准方法。因此,我创建了一个带有自己的依赖项属性的Class。它具有属性MyIsEnabledMyStyle。您可能会从标题中猜到,第一个设置其属性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
P.S.对不起,迟到的答案:)。

关于wpf - 禁用父级时启用子级控件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14584662/

10-09 08:09