如何访问已在XAML ControlTemplate中声明的图像?

时间:2016-05-16 17:30:11

标签: c# wpf xaml

我有以下XAML标记,其中我在data Natty :: Nat -> * where Zy :: Natty 'Z Sy :: Natty n -> Natty ('S n) plus :: Natty m -> Natty n -> Natty (m :+ n) plus Zy n = n plus (Sy m) n = Sy (plus m n) times :: Natty m -> Natty n -> Natty (m :* n) times Zy _ = Zy times (Sy m) n = n `plus` (m `times` n) square :: Natty n -> Natty (n :* n) square n = times n n 内的<Image>内嵌入了几个<StackPanel>标记,位于<Grid>内:

<ControlTemplage>

我可以在Visual Studio的预览窗口中看到这些图像在我的GUI上<Window.Resources> <Style...> ... <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type TabControl}"> <Grid ...> ... <StackPanel Grid.Row="1" Orientation="Horizontal" FlowDirection="RightToLeft"> <Image x:Name="connectedFlag" ... /> <Image x:Name="disconnectedFlag" ... /> </StackPanel> </Grid> </ControlTemplate> </Setter> </Setter> </Style> </Window.Resources> 的{​​{1}}内正确显示,但是,我现在想要从我的C#中访问图像,以便我可以调用函数来显示/隐藏图像,具体取决于我的应用程序是否连接到服务器。

我的C#中有一个<Grid>方法,其中我尝试设置<ControlTemplate>的{​​{1}}属性&amp; continuousThread()取决于满足的条件,即

Visibility

但是,我在C#中遇到了一些编译错误:

  

名称&#39; disconnectedFlag&#39;在当前上下文中不存在   名称&#39; connectedFlag&#39;在当前上下文中不存在

为什么我不能引用我的标记&#39; connectedFlag文件中的变量?有人有什么建议吗?

2 个答案:

答案 0 :(得分:0)

想象一下,该模板实例化了两次,或十九次,或300次。这是WPF中模板的默认情况。当您在不同的地方有300个名称时,您希望该名称引用哪个disconnectedFlag?没有办法打电话。如果它还没有被实例化怎么办?你想要做的是荒谬。

您应该尝试使用ControlTemplate中的触发器完成的操作。

<ControlTemplate TargetType="{x:Type TabControl}">
    <Grid ...>
        ...
        <StackPanel Grid.Row="1" Orientation="Horizontal" FlowDirection="RightToLeft">
            <Image x:Name="connectedFlag" ... />
            <Image x:Name="disconnectedFlag" ... />
        </StackPanel>
    </Grid>
    <ControlTemplate.Triggers>
        <DataTrigger Binding="{Binding Condition}" Value="True">
            <Setter TargetName="connectedFlag" Value="Hidden" />
            <Setter TargetName="disconnectedFlag" Value="Visible" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Condition}" Value="False">
            <Setter TargetName="connectedFlag" Value="Visible" />
            <Setter TargetName="disconnectedFlag" Value="Hidden" />
        </DataTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

Condition应在您的viewmodel上公开,作为在其值更改时引发PropertyChanged的属性。如果您没有视图模型,我们可以在您的视图中定义它,并为它设计一个不同的绑定,以便以这种方式工作。

答案 1 :(得分:0)

所以这个问题与XAML放置<Image>标签的位置有关...为了摆脱编译错误,将图像放在GUI上我想要的位置,我搬了<StackPanel>&amp;之外的图像<TabItem>标记,但将其保留在<Grid>

<Grid>
    <Image...>... </Image>
    <TabControl...>
        <TabItem...>
            <StackPanel ...>