Как правильно чистить, когда в GeometryGroup есть только один геометрический объект? - PullRequest
0 голосов
/ 11 октября 2011

У меня есть ярлык (скажем, myLabel) размером 60х60, и я хочу установить его фон на DrawingBrush. Мой код:

GeometryGroup testGroup = new GeometryGroup();
testGroup.Children.Add(new RectangleGeometry(new Rect(20, 20, 10, 10)));
//testGroup.Children.Add(new RectangleGeometry(new Rect(40, 40, 10, 10)));
myLabel.Background=new DrawingBrush(
                   new GeometryDrawing(Brushes.Black, null, testGroup));

Если я раскомментирую третью строку, она отлично работает (с двумя черными квадратами внутри метки) Но если testGroup содержит только один геометрический объект, myLabel будет полностью черным. Изменение FillRule или присвоение кисти ненулевого значения Pen не влияет на результат.

Итак, как я могу нарисовать только один прямоугольник в качестве фона метки? Спасибо ~

ОБНОВЛЕНИЕ : больше исходного кода

for (int i = 0; i < 6; i++)
{
    for (int j = 0; j < 6; j++)
    {
        GeometryGroup testGroup = new GeometryGroup();
        testGroup.Children.Add(new RectangleGeometry(new Rect(20, 20, 10, 10)));
        labelArray[i, j].Background =
            new DrawingBrush(
                new GeometryDrawing(
                    Brushes.Black, null, testGroup));
    }
}

сгенерирует:

enter image description here

, а

for (int i = 0; i < 6; i++)
{
    for (int j = 0; j < 6; j++)
    {
        GeometryGroup testGroup = new GeometryGroup();
        testGroup.Children.Add(new RectangleGeometry(new Rect(20, 20, 10, 10)));
        testGroup.Children.Add(new RectangleGeometry(new Rect(40, 40, 10, 10)));
        labelArray[i, j].Background =
            new DrawingBrush(
                new GeometryDrawing(
                    Brushes.Black, null, testGroup));
    }
}

сгенерирует:

enter image description here

Я хочу, чтобы в каждом labelArray[i, j] был только один черный квадрат, что также является первоначальной целью первого фрагмента.

ОБНОВЛЕНИЕ 2 : Спасибо за предложение @ AngelWPF:

for (int i = 0; i < 6; i++)
{
    for (int j = 0; j < 6; j++)
    {
        GeometryGroup testGroup = new GeometryGroup();
        testGroup.Children.Add(new RectangleGeometry(new Rect(-10, -10, 10, 10)));
        testGroup.Children.Add(new RectangleGeometry(new Rect(10, 10, 10, 10)));
        DrawingBrush brush = new DrawingBrush(
            new GeometryDrawing(Brushes.Black, null, testGroup));
        brush.Stretch = Stretch.None;
        labelArray[i, j].Background = brush;
}

правильно генерирует:

enter image description here

Но

for (int i = 0; i < 6; i++)
{
    for (int j = 0; j < 6; j++)
    {
        GeometryGroup testGroup = new GeometryGroup();
        testGroup.Children.Add(new RectangleGeometry(new Rect(20, 20, 10, 10)));
        DrawingBrush brush = new DrawingBrush(
            new GeometryDrawing(Brushes.Black, null, testGroup));
        brush.Stretch = Stretch.None;
        labelArray[i, j].Background = brush;
}

сгенерирует:

enter image description here

, где прямоугольники неправильно размещены в центре этикетки.

1 Ответ

1 голос
/ 11 октября 2011

Просто сделай свой

   DrawingBrush.Stretch="None"
   DrawingBrush.ViewboxUnits="Absolute"
   DrawingBrush.Viewbox = new Rect(0,0,60,60);

Или используйте этот XAML для применения ко всем меткам ...

    <Style TargetType="{x:Type Label}">
       <Setter Property="Background">
          <Setter.Value>
             <DrawingBrush Stretch="None" ViewboxUnits="Absolute" >
                 <DrawingBrush.Viewbox>
                     <Rect X="0" Y="0" Height="60" Width="60"/>
                 </DrawingBrush.Viewbox>
                 <DrawingBrush.Drawing>
                   <DrawingGroup>
                     <GeometryDrawing Brush="Black">
                       <GeometryDrawing.Geometry>
                         <RectangleGeometry>
                           <RectangleGeometry.Rect>
                              <Rect X="20" Y="20" Width="10" Height="10"/>
                           </RectangleGeometry.Rect>
                         </RectangleGeometry>
                       </GeometryDrawing.Geometry>
                     </GeometryDrawing>
                     <!--<GeometryDrawing Brush="Black">
                       <GeometryDrawing.Geometry>
                         <RectangleGeometry>
                           <RectangleGeometry.Rect>
                             <Rect X="40" Y="40" Width="10" Height="10"/>
                           </RectangleGeometry.Rect>
                         </RectangleGeometry>
                       </GeometryDrawing.Geometry>
                     </GeometryDrawing>-->                                        
                 </DrawingGroup>
              </DrawingBrush.Drawing>
           </DrawingBrush> 
        </Setter.Value>
      </Setter>
    </Style>

Надеюсь, это поможет.

...