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.