Подтвердить что ты не робот

В WPF можно использовать один и тот же ресурс изображения между двумя кнопками

Я хочу создать кнопку включения/выключения в WPF, и я хочу, чтобы он менял свой внешний вид, когда пользователь нажимает на него (если он отключился, если он отключился от включения), используя изображения. Я добавил изображения, которые я хочу использовать для ресурсов:

 <Window.Resources>
    <Image x:Key="Off1" Source="/WPFApplication;component/Images/off_button.png" Height="30" Width="70" />
    <Image x:Key="On1" Source="/WPFApplication;component/Images/on_button.png" Height="30" Width="70"/>
 </Window.Resources>

И код события: "flag" - это логическая переменная типа Boolean initialize as true:

 private void OnOff1Btn_Click(object sender, RoutedEventArgs e)
    {
        if (flag)
        {
            OnOff1Btn.Content = FindResource("Off1");
            flag = false;     
        }
        else
        {
            OnOff1Btn.Content = FindResource("On1");
            flag  = true;
        }
    }

Теперь мне нужно создать 2 кнопки включения/выключения, которые ведут себя одинаково. Когда я попытался использовать те же ресурсы для второй кнопки, я получил исключение:

 Specified element is already the logical child of another element. Disconnect it first.

Можно ли использовать одни и те же ресурсы изображений во второй кнопке или мне нужно снова добавить изображения в качестве ресурсов с помощью другого ключа?

4b9b3361

Ответ 1

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

<BitmapImage x:Key="Off1" UriSource="/WPFApplication;component/Images/off_button.png" Height="30" Width="70" />
<BitmapImage x:Key="On1" UriSource="/WPFApplication;component/Images/on_button.png" Height="30" Width="70"/>

После этого вы можете создать несколько Image с помощью BitmapImage

В XAML

 <Button ..>
  <Button.Content>
   <Image Source="{StaticResource Off1}" />
  </Button.Content>
 </Button>

В коде

  Image image = new Image();
  image.Source = FindResource("Off1");
  OnOff1Btn.Content = image; 

Ответ 2

Установите общий стиль в вашем стиле на false

<StackPanel >
   <StackPanel.Resources>
      <Image x:Key="flag" Source="flag-italy-icon.png" Width="10" x:Shared="false"/>
   </StackPanel.Resources>

   <ContentControl Content="{DynamicResource flag}" />
   <ContentControl Content="{DynamicResource flag}" />

Ответ 3

Хотя решение @Tilak определенно является одним из способов, вы также можете сделать это через Style.Triggers

Здесь пример (с предположением, что Flag является флагом выставления публичного имущества):

<Button Content="{StaticResource On1}">
    <Button.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Flag}" Value="false">
                    <Setter Property="Content" Value="{StaticResource Off1}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>