wpf button hyperlink disabled-control

wpf - Habilite un control secundario cuando el padre está deshabilitado



button hyperlink (1)

Control Hyperlink tiene una extraña característica con la propiedad IsEnabled . Además del que mencionaste, es decir, la herencia de valor completo de un padre, hay otro similar.

Hyperlink para el control específico, que se ha desactivado ( IsEnabled="False" ), la configuración ( IsEnabled="True" ) no actualizará la propiedad del Hyperlink . La solución: use una fuente relativa para Hyperlink (más información ).

Para resolver su pregunta, he decidido que no es la forma estándar de resolverlo. Así que creé una Class con sus propias propiedades de dependencias. Tiene su propiedad MyIsEnabled y MyStyle . Como se puede adivinar por el título, el primero establece su propiedad IsEnabled y MyStyle necesita especificar el estilo del botón, simulando el 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>

Definir el Button con sus propiedades:

<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); } } }

Además, para el evento, el Hyperlink apunta a e.Handled = true , de modo que el evento no ocurra después.

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

PD: Perdón por la respuesta tardía :).

Tengo un botón que contiene un hipervínculo, así:

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

Necesito que el hipervínculo esté habilitado, sin embargo, el botón está deshabilitado. ¿Cómo puedo conseguir esto?

Lo anterior simplemente da como resultado que ambos controles estén deshabilitados.