WPF: невозможно установить цвет фона для пользовательского элемента управления, когда элемент управления отключен в XAML - PullRequest
2 голосов
/ 22 апреля 2011

У меня есть собственный элемент управления IPAddressBox в проекте WPF / C #, который я унаследовал.Элемент управления работает отлично, но он не позволяет мне изменять фон в XAML, когда элемент управления отключен (я могу успешно изменить его с помощью кода позади, но я отчаянно пытаюсь разорвать связь между пользовательским интерфейсом и бизнес-логикой и хочучтобы избавиться от «Знания каждой детали пользовательского интерфейса в моем бизнес-коде»

У меня есть несколько элементов управления, которые включаются / отключаются в зависимости от выбора поля со списком - поле со списком резервных копий - с двумя вариантами выбора - DVD-RW или Сеть. Если они выбирают Сеть, у меня есть элемент управления IPAddress и элементы управления текстом / паролем для учетных данных. Я могу успешно включить / отключить элементы управления, привязав свойство IsEnabled в классе, но не могу получитьфон элемента управления IP стал серым. У меня есть весь код элемента управления (XAML & CS), а также мой собственный код - я довольно новичок в WPF и пытаюсь научиться делать все правильно, а не сразу маршрутизировать всесобытия в CS и делаю это там ....

Вот частьмой XAML с моей (последней) попыткой изменить фон:

<automation:IPAddressBox  Grid.Column=" 4" Grid.Row="4"                 
 Name="ipAddressBox_BackupIpAddress" Background="White" 
 IsEnabled="{Binding Path=IsBackupEnabled}">

 <automation:IPAddressBox.Style>
      <Style TargetType="{x:Type automation:IPAddressBox}">
      <Style.Triggers>
          <DataTrigger Binding="{Binding Path=IsBackkupEnabled}" Value="false">
        <Setter Property="Background" Value="LightGray"/>
         </DataTrigger>
     </Style.Triggers>
     </Style>
  </automation:IPAddressBox.Style>
</automation:IPAddressBox> "

<-- Other related controls -->

<Label Grid.Column="6" Grid.Row="2" Name="label_BackupUserID" Content="User ID:" 
       HorizontalAlignment="Right" IsEnabled="{Binding Path=IsBackupEnabled}" />

<TextBox Grid.Column="8" Grid.Row="2" Name="txtBackupUserID" 
     IsEnabled="{Binding Path=IsBackupEnabled}" />

<Label Grid.Column="6" Grid.Row="4" Name="label_BackupPassword" Content="Password:" 
       HorizontalAlignment="Right" IsEnabled="{Binding Path=IsBackupEnabled}" />

<PasswordBox Grid.Column="8" Grid.Row="4" Name="passwordBox_BackupPassword" 
       IsEnabled="{Binding Path=IsBackupEnabled}" />

Обратите внимание, что я устанавливаю цвет фона на Белый, так как базовый элемент управления "прозрачен" по некоторым причинам.Я пробовал различные стили / триггеры как на контроллере, так и в моем собственном коде, всем не повезет, если я сделаю то, что мне нужно - то есть, чтобы фон стал серым

- вот контрольный XAML для справки- Я не уверен, что мне нужно включить общедоступные свойства, доступные в элементе управления, и есть в основном два интереса - Foreground (тип кисти) и BorderBrush (также тип кисти) - я попытался добавить IsEnabled к свойствам элемента управления, пытаясь изменить фон там - опять же без удачи - единственное место, где он работает - это "OnSelectionChanged для выпадающего списка в моем коде.

Вот упрощенный xaml для IpAddressBox (я удалилнесколько всплывающих окон, отображающих недопустимые значения)

<UserControl.Resources>
  <Style x:Key="textBoxStyle" TargetType="{x:Type TextBoxBase}">
    <Setter Property="OverridesDefaultStyle" Value="True" />
       <Setter Property="Template">
       <Setter.Value>
           <ControlTemplate TargetType="{x:Type TextBoxBase}">
          <ScrollViewer x:Name="PART_ContentHost" Margin="0,3,0,0" />
           </ControlTemplate>
       </Setter.Value>
       </Setter/>
   </Style>
</UserControl.Resources>

<Border Name="border_IpAddressBox" BorderBrush="Black" BorderThickness="1">
   <Grid>
      <automation:NumericTextBox Height="23" x:Name="numericTextBox1" Width="30" 
      MinWidth="30" MaxWidth="30" HorizontalAlignment="Left" VerticalAlignment="Top"
      BorderBrush="Transparent" MaxLength="3" HorizontalContentAlignment="Center"
      ContextMenu="{StaticResource contextMenu_TextBox}" Background="Transparent" 
      Style="{StaticResource textBoxStyle}" />

     <automation:NumericTextBox Height="23" Margin="42,0,0,0" x:Name="numericTextBox2" 
       VerticalAlignment="Top" HorizontalAlignment="Left" Width="30" MinWidth="30" 
       MaxWidth="30" BorderBrush="Transparent" MaxLength="3" 
       HorizontalContentAlignment="Center" ContextMenu="{StaticResource 
       contextMenu_TextBox}" Background="Transparent" 
       Style="{StaticResource textBoxStyle}" IsTabStop="False" />

     <automation:NumericTextBox Height="23" Margin="84,0,0,0" x:Name="numericTextBox3" 
       VerticalAlignment="Top" HorizontalAlignment="Left" Width="30" MinWidth="30" 
       MaxWidth="30" BorderBrush="Transparent" MaxLength="3" 
       HorizontalContentAlignment="Center" ContextMenu="{StaticResource 
       contextMenu_TextBox}" Background="Transparent" Style="{StaticResource 
       textBoxStyle}" IsTabStop="False" />

     <automation:NumericTextBox Height="23" Margin="126,0,0,0" x:Name="numericTextBox4" 
       VerticalAlignment="Top" HorizontalAlignment="Left" Width="30" MinWidth="30"  
       MaxWidth="30" BorderBrush="Transparent" MaxLength="3" 
       HorizontalContentAlignment="Center" ContextMenu="{StaticResource 
       contextMenu_TextBox}" Background="Transparent" Style="{StaticResource 
       textBoxStyle}" IsTabStop="False" />

    <Label Name="label1" Height="23" Margin="30,0,0,0" VerticalAlignment="Top" 
       HorizontalAlignment="Left" Width="12">.</Label>

    <Label Name="label2" Height="23" HorizontalAlignment="Left" Margin="72,0,0,0" 
       VerticalAlignment="Top" Width="12">.</Label>

    <Label Name="label3" Height="23" HorizontalAlignment="Left" Margin="114,0,0,0" 
       VerticalAlignment="Top" Width="12">.</Label>

    </Grid>
  </Border>
</UserControl>

NumericTextBox - это просто еще один пользовательский элемент управления, ограничивающий ввод текста числовыми значениями - только реализация CS, без участия XAML.

Заранее спасибо за любыепомощь - 20 лет в разработке программного обеспечения, и это мой первый вопрос, который я когда-либо отправлялed - Google обычно делает трюк, но не в этот раз:)

- Брайан

1 Ответ

0 голосов
/ 22 апреля 2011

Нельзя явно установить фон для белого, а затем переопределить его с применением значения стиля. Значение стиля «слабее», чем то, что называется локальным значением, и никогда не будет переопределять его. Просто перенесите настройку белого фона в стиль, и он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...