如果图像(来自动态资源)不可用,则按钮默认内容

Button default content if image (from dynamic resource) is not available

在用户控件中,我希望按钮显示图像(由动态资源提供)。如果动态资源不可用/应用程序不提供,我希望按钮显示一些默认内容。

我的想法是将默认内容放入位于图像下方的文本块中,并在图像源为 null 时将其隐藏(因此它不会透出)。但是如果解析 DynamicResource 失败,这种情况似乎不起作用。在这种情况下,图像来源的状态究竟是什么?

<Button Command="{Binding DoSomethingCommand}">
  <Grid>
    <TextBlock Text="DefaultText" Visibility="Collapsed">
         <TextBlock.Style>
           <Style TargetType="TextBlock">
            <Style.Triggers>
              <DataTrigger Binding="{Binding ElementName=TestImage, Path=Source}" Value="{x:Null}">
                 <Setter Property="Visibility" Value="Visible"></Setter>
              </DataTrigger>
            </Style.Triggers>
           </Style>
          </TextBlock.Style>
    </TextBlock>
    <Image x:Name="TestImage" Source="{DynamicResource SomeResource}" Stretch="None"/>
    </Grid>
  </Button>

什么是合适的解决方案?

感谢您的帮助!

试试这个:

    <Button Command="{Binding DoSomethingCommand}">
        <Grid>
            <TextBlock Text="DefaultText" />
            <Image x:Name="TestImage" Source="{DynamicResource SomeResource}" Stretch="None"/>
        </Grid>
    </Button>

只有在资源查找成功时,TextBlock才会被Image隐藏。

The problem with this is, that the default content shines through if the image is showing and it does not cover the entire default content

那这个呢?

    <Button Command="{Binding DoSomethingCommand}">
        <Grid>
            <Image x:Name="TestImage" Source="{DynamicResource SomeResource}" Stretch="None"/>
            <TextBlock Text="DefaultText">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Visibility" Value="Collapsed" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=Source, ElementName=TestImage}" Value="{x:Null}">
                                <Setter Property="Visibility" Value="Visible" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </Grid>
    </Button>