Установка видимости многоугольника из стиля TextBlock - PullRequest
0 голосов
/ 15 мая 2019

У меня небольшая проблема. Любые предложения очень ценятся.

im trying to display something like this

Проблема: Я получаю свою ценность в RowData.Row.ScannedQty в этой пропе.и я отправляю его на этот WarehouseInventoryDefineValueConvertor и проверяю, равно ли это значение нулю, плюс или минус, основываясь на том, что я добавил + или -, но проблема в том, чтобы установить видимость полигона, который я не могу использовать, так как Dpне связывается, как я могу достичь этого?

Решения, которые я рассмотрел:

1. Используя прокси TextBlock, сохраните значение и используйте его в DataTrigger

2. вызов моего конвертера на каждом полигоне (это вариант, которого я хочу избежать, поскольку вызов конвертера увеличивается в 4 раза)

 <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="{Binding ElementName=MinusPolygon,Path=Visibility}" Value="Collapsed"></Setter>
                    <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="{Binding ElementName=MinusPolygon,Path=Visibility}" Value="Visble"></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 Name="MinusPolygon" Points="0,0 5,10, 10,0" Stroke="Red" Fill="Red" />
            <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 раза, есть ли лучший способ сделать это?

<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>

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Если вы не хотите создавать пользовательский элемент управления или UserControl, вы можете установить для свойства Tag TextBlock значение Visibility, а затем связать Polygon * * 1006.* свойство Tag свойство TextBlock:

<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 раза», вы должны вернуть «Ноль», «Плюс» или «Минус "из свойства источника в модели представления вместо преобразования значения в представлении.

1 голос
/ 15 мая 2019

Существует несколько различных способов решения этой проблемы, я обычно делаю это путем шаблонирования существующего элемента управления, например, что-то вроде этого:

<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 или что-то, где вы хотите, чтобы фактический текст отображался в дочерних шаблонах.

...