Как изменить VisualBrush программно? - PullRequest
0 голосов
/ 11 октября 2019

В xaml Window.Resources я определил VisualBrush:

    <VisualBrush x:Name="LineVisualBrush" x:Key="LineVisualBrush" TileMode="Tile" Viewport="0,0,40,40" ViewportUnits="Absolute" Viewbox="0,0,40,40" ViewboxUnits="Absolute" PresentationOptions:Freeze="True">
        <VisualBrush.Visual>
            <Grid Background="Black">
                <Path Data="M 0 0 L 40 0" Stroke="White" />
            </Grid>
        </VisualBrush.Visual>
    </VisualBrush>

В исходном коде мне нужно изменить цвет фона сетки и цвет обводки пути:

        VisualBrush vb = new VisualBrush();
        vb = (VisualBrush)Resources["LineVisualBrush"];

        vb.Visual.SetValue(Grid.BackgroundProperty, new SolidColorBrush(Colors.Red));
        vb.Visual.SetValue(Shape.StrokeProperty, new SolidColorBrush(Colors.Blue));

проблема в том, что он установил цвет обводки пути на красный вместо синего и не изменил цвет фона сетки.

1 Ответ

0 голосов
/ 12 октября 2019

Я нашел проблемы.

Сначала. Сетка в Xaml имеет высоту 0, поэтому фон не виден. Но я думаю, что благодаря Антиалиасу часть цвета видна в Пути. Добавление высоты к сетке устраняет проблему с цветом фона.

<VisualBrush x:Name="LineVisualBrush" x:Key="LineVisualBrush" TileMode="Tile" Viewport="0,0,40,40" ViewportUnits="Absolute" Viewbox="0,0,40,40" ViewboxUnits="Absolute" PresentationOptions:Freeze="True">
    <VisualBrush.Visual>
            <Grid Background="Black" Height = 40>
            <Path Data="M 0 0 L 40 0" Stroke="White" />
        </Grid>
    </VisualBrush.Visual>
</VisualBrush>

Секунда. Мне нужно получить доступ к дочерним элементам Visual в коде позади, чтобы изменить цвет обводки пути. Я изменил код таким образом, и теперь он работает отлично.

VisualBrush vb = (VisualBrush)Resources["LineVisualBrush"];
Grid grid = (Grid)vb.Visual;
System.Windows.Shapes.Path path = (System.Windows.Shapes.Path)grid.Children[0];
grid.Background = new SolidColorBrush(Colors.Red);
path.Stroke = new SolidColorBrush(Colors.Blue);
...