Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从TextBlock样式设置多边形可见性_C#_Wpf_Mvvm_Datatrigger - Fatal编程技术网

C# 从TextBlock样式设置多边形可见性

C# 从TextBlock样式设置多边形可见性,c#,wpf,mvvm,datatrigger,C#,Wpf,Mvvm,Datatrigger,我有个小问题,任何人的建议都非常感谢 问题: 我在该道具的RowData.Row.ScannedQty中获取我的值。我将其发送到仓库库存定义值转换器,并根据我添加的+或-检查值是否为零或正或负,但问题是设置多边形的可见性,我不能这样使用,因为Dp不可绑定。我如何实现这一点 我考虑过的解决方案: 1.使用代理文本块将值保存在那里,并在DataTrigger中使用 2.在每个多边形上调用我的转换器(这是一个选项,我想避免,因为对转换器的调用增加了4倍) 基于答案 我给converter打了三次

我有个小问题,任何人的建议都非常感谢

问题: 我在该道具的
RowData.Row.ScannedQty
中获取我的值。我将其发送到仓库库存定义值转换器,并根据我添加的+或-检查值是否为零或正或负,但问题是设置多边形的可见性,我不能这样使用,因为Dp不可绑定。我如何实现这一点

我考虑过的解决方案:

1.使用代理文本块将值保存在那里,并在DataTrigger中使用

2.在每个多边形上调用我的转换器(这是一个选项,我想避免,因为对转换器的调用增加了4倍)


基于答案

我给converter打了三次电话,有没有更好的方法

<Style.Triggers>
                <DataTrigger Binding="{Binding RowData.Row.ScannedQty,Converter={UIConverter:WarehouseInventoryDefineValueConvertor}Value="Zero">
                    <Setter Property="Template" Value="{StaticResource ZeroTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding RowData.Row.ScannedQty,Converter={UIConverter:WarehouseInventoryDefineValueConvertor}}" Value="Plus">
                    <Setter Property="Template" Value="{StaticResource PositiveTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding RowData.Row.ScannedQty,Converter={UIConverter:WarehouseInventoryDefineValueConvertor}}" Value="Minus">
                    <Setter Property="Template" Value="{StaticResource NegativeTemplate}" />
                </DataTrigger>
            </Style.Triggers>


有许多不同的方法可以解决这个问题,我通常通过模板化现有控件来实现,例如:

<Control>
    <Control.Style>
        <Style TargetType="Control">
            <Style.Triggers>
                <DataTrigger Binding="{Binding SomeBoundProperty}" Value="Zero">
                    <Setter Property="Template" Value="{StaticResource ZeroTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding SomeBoundProperty}" Value="Plus">
                    <Setter Property="Template" Value="{StaticResource PositiveTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding SomeBoundProperty}" Value="Minus">
                    <Setter Property="Template" Value="{StaticResource NegativeTemplate}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Control.Style>
</Control>

然后,您可以在资源块中以自己喜欢的方式声明每个模板:

<ControlTemplate x:Key="ZeroTemplate" TargetType="Control">
    <Grid>
        <!-- etc -->
    </Grid>
</ControlTemplate>

这样,可视树中唯一的元素就是那些实际可见的元素


我在这里使用了一个通用控件,但您当然也可以使用TextBlock,然后将ContentPresenter或其他东西放在希望实际文本显示在子模板中的位置。

有许多不同的方法来解决这个问题,我通常通过模板化现有控件来实现,例如:

<Control>
    <Control.Style>
        <Style TargetType="Control">
            <Style.Triggers>
                <DataTrigger Binding="{Binding SomeBoundProperty}" Value="Zero">
                    <Setter Property="Template" Value="{StaticResource ZeroTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding SomeBoundProperty}" Value="Plus">
                    <Setter Property="Template" Value="{StaticResource PositiveTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding SomeBoundProperty}" Value="Minus">
                    <Setter Property="Template" Value="{StaticResource NegativeTemplate}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Control.Style>
</Control>

然后,您可以在资源块中以自己喜欢的方式声明每个模板:

<ControlTemplate x:Key="ZeroTemplate" TargetType="Control">
    <Grid>
        <!-- etc -->
    </Grid>
</ControlTemplate>

这样,可视树中唯一的元素就是那些实际可见的元素


我在这里使用了一个通用控件,但您当然也可以使用TextBlock,然后将ContentPresenter或其他东西放在希望实际文本显示在子模板中的位置。

如果您不想创建自定义控件或
用户控件
,您可以将
文本块
标记
属性设置为
可见性
值,然后将
多边形
可见性
属性绑定到
文本块
标记
属性:

<StackPanel>
    <TextBlock Grid.Row="0" Name="TxtScannedQty" Text="{Binding RowData.Row.ScannedQty, Converter={UIConverter:WarehouseInventoryDefineValueConvertor}}" HorizontalAlignment="Right">
        <TextBlock.Style>
            <Style TargetType="{x:Type TextBlock}">
                <Setter Property="Tag" Value="Collapsed" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=TxtScannedQty,Path=Text}" Value="Zero">
                        <Setter Property="Text" Value="{Binding RowData.Row.ScannedQty, StringFormat= {}{0}}"></Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=TxtScannedQty,Path=Text}" Value="Plus">
                        <Setter Property="Text" Value="{Binding RowData.Row.ScannedQty, StringFormat= +{}{0}}"></Setter>
                        <Setter Property="Tag" Value="Visible"></Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=TxtScannedQty,Path=Text}" Value="Minus">
                        <Setter Property="Text" Value="{Binding RowData.Row.ScannedQty, StringFormat= -{}{0}}"></Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
    <Grid>
        <Polygon Name="PlusPolygon" Points="5,0 10,10, 0,10" Stroke="Green" Fill="Green">
            <Polygon.Style>
                <Style TargetType="Polygon">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Visibility, ElementName=MinusPolygon}" Value="Visible">
                            <Setter Property="Visibility" Value="Collapsed" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Polygon.Style>
        </Polygon>
        <Polygon Name="MinusPolygon" Points="0,0 5,10, 10,0" Stroke="Red" Fill="Red"
                         Visibility="{Binding Tag, ElementName=TxtScannedQty}" />
        <Line Name="Zero1" Stroke="Gray" X1="0" Y1="2" X2="10" Y2="2" SnapsToDevicePixels="True" RenderOptions.EdgeMode="Aliased"   StrokeThickness="2" />
        <Line Name="Zero2" Stroke="Gray" X1="0" Y1="4" X2="10" Y2="4" SnapsToDevicePixels="True" RenderOptions.EdgeMode="Aliased"   StrokeThickness="2" />
    </Grid>
</StackPanel> 


如果不想“调用转换器3次”,则应在视图模型的源属性中返回“零”、“加”或“减”,而不是在视图中转换值。

如果不想创建自定义控件或
用户控件
,您可以将
文本块
标记
属性设置为
可见性
值,然后将
多边形
可见性
属性绑定到
文本块
标记
属性:

<StackPanel>
    <TextBlock Grid.Row="0" Name="TxtScannedQty" Text="{Binding RowData.Row.ScannedQty, Converter={UIConverter:WarehouseInventoryDefineValueConvertor}}" HorizontalAlignment="Right">
        <TextBlock.Style>
            <Style TargetType="{x:Type TextBlock}">
                <Setter Property="Tag" Value="Collapsed" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=TxtScannedQty,Path=Text}" Value="Zero">
                        <Setter Property="Text" Value="{Binding RowData.Row.ScannedQty, StringFormat= {}{0}}"></Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=TxtScannedQty,Path=Text}" Value="Plus">
                        <Setter Property="Text" Value="{Binding RowData.Row.ScannedQty, StringFormat= +{}{0}}"></Setter>
                        <Setter Property="Tag" Value="Visible"></Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=TxtScannedQty,Path=Text}" Value="Minus">
                        <Setter Property="Text" Value="{Binding RowData.Row.ScannedQty, StringFormat= -{}{0}}"></Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
    <Grid>
        <Polygon Name="PlusPolygon" Points="5,0 10,10, 0,10" Stroke="Green" Fill="Green">
            <Polygon.Style>
                <Style TargetType="Polygon">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Visibility, ElementName=MinusPolygon}" Value="Visible">
                            <Setter Property="Visibility" Value="Collapsed" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Polygon.Style>
        </Polygon>
        <Polygon Name="MinusPolygon" Points="0,0 5,10, 10,0" Stroke="Red" Fill="Red"
                         Visibility="{Binding Tag, ElementName=TxtScannedQty}" />
        <Line Name="Zero1" Stroke="Gray" X1="0" Y1="2" X2="10" Y2="2" SnapsToDevicePixels="True" RenderOptions.EdgeMode="Aliased"   StrokeThickness="2" />
        <Line Name="Zero2" Stroke="Gray" X1="0" Y1="4" X2="10" Y2="4" SnapsToDevicePixels="True" RenderOptions.EdgeMode="Aliased"   StrokeThickness="2" />
    </Grid>
</StackPanel> 


如果您不想“调用转换器3次”,则应在视图模型中的源属性中返回“零”、“加”或“减”,而不是在视图中转换值。

我添加了有问题的小brock,请查看please@AvinashReddy:不要使用转换器。看到我的答案了。我加了一个小问题,请大家看看please@AvinashReddy:不要使用转换器。看看我的答案。