2009-05-08 4 views
4

Я пытаюсь получить эффект «затемнения всего окна и всех элементов управления на нем».Можно ли изменить цвет фона отключенной кнопки в WPF?

Окно и все на нем также необходимо отключить.

Проблема в том, что когда кнопка отключена, она не позволяет вам изменить цвет фона.

Есть ли способ в WPF изменить цвет фона кнопки, даже если он отключен?

XAML:

<Window x:Class="TestDimWindows.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 

    <Grid x:Name="dimElement"> 
     <StackPanel HorizontalAlignment="Left"> 
      <TextBlock 
       Text="This is an example of dimming a window." 
       Margin="5"/> 
      <StackPanel 
       HorizontalAlignment="Left" 
       Margin="5"> 
       <Button x:Name="theButton" 
         Content="Dim the window" 
         Click="Button_Click"/> 
      </StackPanel> 
     </StackPanel> 
    </Grid> 

</Window> 

Код За:

using System.Windows; 
using System.Windows.Media; 

namespace TestDimWindows 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      dimElement.Background = new SolidColorBrush(Colors.Gray); 
      dimElement.Opacity = 0.5; 
      dimElement.IsEnabled = false; 

      //I want this button to look "dimmed out" as well 
      //but since it is disabled, it is a ghostly white. 
      //how can I change the color even though it is disabled? 
      theButton.Background = new SolidColorBrush(Colors.Gray); 
     } 
    } 
} 

ответ

1

Вы можете создать свой собственный шаблон управления для него.

Я бы предложил использовать Blend (вы можете получить пробную версию, если у вас нет лицензии), чтобы создать копию используемого вами шаблона.

Если вы изучите текущий шаблон, он должен установить цвет фона для какой-либо функции. Найдите триггер, основанный на свойстве IsEnabled.

1

Вы можете просто удалить onclick и изменить цвет и сделать это «отключенным» состоянием.

0

Посмотрите на VisualBrush. Вы можете настроить визуализацию VisualBrush на элемент управления, а VisualBrush заново создаст визуальное представление элемента управления без какой-либо реальной функциональности.

Я взял этот пример из «Программирование WPF» Sells/Griffiths (глава 13 на графике) и немного изменил его самостоятельно, а затем немного больше, чтобы продемонстрировать вам решение.

Это создает простой интерфейс рисования (ввод координат x и y из двух точек для рисования линии), но также отражает изображение ниже. Он не должен быть надежным вообще, но он должен продемонстрировать функциональность, я думаю, что вы ищете.
Последние два элемента прямоугольника с VisualBrush и SolidColorBrush - это то, как я создаю дублированный элемент управления, а затем затушевываю его.

Что вы можете сделать, это наложить эти 2 элемента на страницу/окно/etc, которые вы хотите затенять, а затем сделать их видимыми, когда вы хотите, чтобы эффект имел место.

Надеюсь, это поможет.

<Window x:Class="GraphicsTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Window.Resources> 
</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="2*"/> 
     <RowDefinition Height="1*"></RowDefinition> 
    </Grid.RowDefinitions> 
    <Grid x:Name="mainUI"> 
     <DockPanel> 
      <GroupBox Header="Point 1" Name="gbPoint1" DockPanel.Dock="Top"> 
       <StackPanel Orientation="Horizontal"> 
        <Label Width="40" HorizontalContentAlignment="Right">X:</Label> 
        <TextBox Name="tbX1" Width="40" TextChanged="Content_TextChanged"/> 
        <Label Width="40" HorizontalContentAlignment="Right">Y:</Label> 
        <TextBox Name="tbY1" Width="40" TextChanged="Content_TextChanged"/> 
       </StackPanel> 
      </GroupBox> 
      <GroupBox Header="Point 2" Name="gbPoint2" DockPanel.Dock="Top"> 
       <StackPanel Orientation="Horizontal"> 
        <Label Width="40" HorizontalContentAlignment="Right">X:</Label> 
        <TextBox Name="tbX2" Width="40" TextChanged="Content_TextChanged"/> 
        <Label Width="40" HorizontalContentAlignment="Right">Y:</Label> 
        <TextBox Name="tbY2" Width="40" TextChanged="Content_TextChanged"/> 
       </StackPanel> 
      </GroupBox> 
      <Canvas> 
       <Line Name="lnDraw" Stroke="Black" StrokeThickness="2"/> 
      </Canvas> 
     </DockPanel> 
    </Grid> 
    <Rectangle Grid.Row="1"> 
     <Rectangle.LayoutTransform> 
      <ScaleTransform ScaleY="-1"/> 
     </Rectangle.LayoutTransform> 
     <Rectangle.Fill> 
      <VisualBrush Visual="{Binding ElementName=mainUI}" /> 
     </Rectangle.Fill> 
    </Rectangle> 
    <Rectangle Grid.Row="1"> 
     <Rectangle.Fill> 
      <SolidColorBrush Color="Black" Opacity=".5"/> 
     </Rectangle.Fill> 
    </Rectangle> 
</Grid> 

И .cs

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void Content_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     int x1; 
     int x2; 
     int y1; 
     int y2; 

     if (int.TryParse(tbX1.Text, out x1) && int.TryParse(tbX2.Text, out x2) && int.TryParse(tbY1.Text, out y1) && int.TryParse(tbY2.Text, out y2)) 
     { 
      lnDraw.X1 = x1; 
      lnDraw.X2 = x2; 
      lnDraw.Y1 = y1; 
      lnDraw.Y2 = y2; 
     } 
    } 
} 
0

Я бы попытаться затемнять эффект с прямоугольником, который заполняет всю сетку, серого цвета, имеет непрозрачность меньше 1 и г -index выше, чем ваши обычные элементы управления. По умолчанию прямоугольник будет иметь видимость = свернуто, тогда я бы использовал триггер, чтобы его видимость была видимой, когда соответствующее свойство IsEnabled переходит в «true».

Смежные вопросы