Как установить пользовательские свойства фоновой зависимости для customgridcontrol - PullRequest
0 голосов
/ 03 ноября 2011

Я использовал пример, который нашел в Интернете, для создания пользовательского элемента управления сеткой.Это позволяет мне размещать линии сетки, которые я хочу сделать каландром.Но теперь, когда я иду, чтобы установить фон, он останавливает отображение моих пользовательских линий сетки.

Я знаю, что это б / к, сначала вызывается OnRender, а затем фон, который избавляется от моих пользовательских настроек.Я связал избавление от переопределения на OnRender, но все же не повезло.Поэтому мой вопрос заключается в том, как создать собственный фон, который будет по-прежнему отображать линии сетки.

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

    <Grid.Background>
        <RadialGradientBrush>
            <GradientStop Color="#FFC3D6F5" Offset="0" />
            <GradientStop Color="#FFEFF5FF" Offset="1" />
        </RadialGradientBrush>
    </Grid.Background>

Это пользовательский элемент управления, который я нашел в Интернете.Он устанавливает только свойства настраиваемой сетки.Мне нужно пользовательское свойство фона сейчас.Это немного сложнее, потому что мой фон не сплошной.

namespace Camp_
{    
public class GridControl : Grid
{

    #region Properties
    public bool ShowCustomGridLines
    {
        get { return (bool)GetValue(ShowCustomGridLinesProperty); }
        set { SetValue(ShowCustomGridLinesProperty, value); }
    }



    public static readonly DependencyProperty ShowCustomGridLinesProperty =
        DependencyProperty.Register("ShowCustomGridLines", typeof(bool), typeof(GridControl), new UIPropertyMetadata(false));

    public Brush GridLineBrush
    {
        get { return (Brush)GetValue(GridLineBrushProperty); }
        set { SetValue(GridLineBrushProperty, value); }
    }


    public static readonly DependencyProperty GridLineBrushProperty =
        DependencyProperty.Register("GridLineBrush", typeof(Brush), typeof(GridControl), new UIPropertyMetadata(Brushes.Black));



    public double GridLineThickness
    {
        get { return (double)GetValue(GridLineThicknessProperty); }
        set { SetValue(GridLineThicknessProperty, value); }
    }

    public static readonly DependencyProperty GridLineThicknessProperty =
        DependencyProperty.Register("GridLineThickness", typeof(double), typeof(GridControl), new UIPropertyMetadata(1.0));
    #endregion

    protected override void OnRender(DrawingContext dc)
    {  

        if (ShowCustomGridLines)
        {

            foreach (var rowDefinition in RowDefinitions)
            {
                dc.DrawLine(new Pen(GridLineBrush, GridLineThickness), new Point(0, rowDefinition.Offset), new Point(ActualWidth, rowDefinition.Offset));
            }

            foreach (var columnDefinition in ColumnDefinitions)
            {
                dc.DrawLine(new Pen(GridLineBrush, GridLineThickness), new Point(columnDefinition.Offset, 0), new Point(columnDefinition.Offset, ActualHeight));
            } 
            dc.DrawRectangle(Brushes.Transparent, new Pen(GridLineBrush, GridLineThickness), new Rect(0, 0, ActualWidth, ActualHeight));
        }
        base.OnRender(dc);
    }

    static GridControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(GridControl), new FrameworkPropertyMetadata(typeof(GridControl)));
    }
}
}

И XAML:

<customgridcontrol:GridControl ShowCustomGridLines="True" GridLineBrush="CornflowerBlue" ShowGridLines="False" >
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
</customgridcontrol:GridControl>

1 Ответ

1 голос
/ 03 ноября 2011

Я думаю, что вам нужно только установить стандартное свойство фона в коде xaml следующим образом:

<customgridcontrol:GridControl ShowCustomGridLines="True" GridLineBrush="CornflowerBlue" ShowGridLines="False" Background="Binding{ StaticResource BrushYouWantTo" >
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                    <ColumnDefinition />
                    <ColumnDefinition />
                    <ColumnDefinition />
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
</customgridcontrol:GridControl>

"Кисть, которую вы хотите" должна установить в качестве ресурса в коде xaml следующим образом:

<Window.Resources>
   <RadialGradientBrush Name="BrushYouWantTo">
      <GradientStop Color="#FFC3D6F5" Offset="0" />
      <GradientStop Color="#FFEFF5FF" Offset="1" />
   </RadialGradientBrush>
</Window.Resources>

Но если вы хотите изменить цвет фона во время работы программы, вам нужно свойство зависимости и обработчик событий, который перезагрузит графический интерфейс.Чтобы использовать этот обработчик событий, вы должны определить его с помощью

new UIPropertyMetadata(CustomGridBackgroundChanged)

. И определение обработчика событий может выглядеть так:

  private static void CustomGridBackgroundChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
  {
     WindowName win = (WindowName)sender;
     if (win.PropertyChanged != null)
     {
        // at this place the gui will be reloaded
        win.PropertyChanged(win, new PropertyChangedEventArgs(null));
     }
  }

Это всего лишь идея, поэтому я не знаю, действительно лиэто работает на практике ... Но я надеюсь, что это поможет вам немного

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...