Нулевые значения, когда я пытаюсь достичь Rectangle - PullRequest
0 голосов
/ 31 мая 2018

У меня есть проект uwp, в котором есть функция бронирования, и я был бы рад получить некоторую помощь по одной вещи.

Так что я пытаюсь достичь Rectangle в моем UserControl измой Main.xaml.cs файл, так что я могу установить свойство Rectangles fill.

Вот как я это сделал:

Метод в Main.xaml.cs для поиска дочернего свойства:

private DependencyObject FindChildControl<T>(DependencyObject control, string ctrlName)
        {
            int childNumber = VisualTreeHelper.GetChildrenCount(control);
            for (int i = 0; i < childNumber; i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(control, i);
                FrameworkElement fe = child as FrameworkElement;
                // Not a framework element or is null
                if (fe == null) return null;

                if (child is T && fe.Name == ctrlName)
                {
                    // Found the control so return
                    return child;
                }
                else
                {
                    // Not found it - search children
                    DependencyObject nextLevel = FindChildControl<T>(child, ctrlName);
                    if (nextLevel != null)
                        return nextLevel;
                }
            }
            return null;
        }

Внутри функции, где я хочу вызвать Rectangle с именем StatusColor, я делаю это:

Rectangle Rec = FindChildControl<Rectangle>(GridView1, "StatusColor") as Rectangle;

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

System.NullReferenceException: 'Ссылка на объект не установлена ​​для экземпляра объекта.'

Я знаю, что есть много сообщений оэто исключение, но я все еще не становлюсь умнее, глядя на них ...

Но, как я уже сказал, я был бы очень рад, если кто-то поможет

Заранее спасибо!

РЕДАКТИРОВАТЬ:

Мой xaml в Main.xaml, чтобы объявить UserControl:

<GridView x:Name="GridView1" ItemContainerStyle="{StaticResource testgrid}" ItemsSource="{x:Bind Rooms}" Width="1740" Height="835" IsHitTestVisible="False" ScrollViewer.HorizontalScrollBarVisibility="Hidden" Margin="75,190,75,100" FontFamily="Segoe MDL2 Assets" IsDoubleTapEnabled="False" IsHoldingEnabled="False" IsRightTapEnabled="False" IsTapEnabled="False">
            <GridView.ItemTemplate>
                <DataTemplate x:DataType="data:Room">
                    <local:TemplateGrid x:Name="TemplateGrid"/>
                </DataTemplate>
            </GridView.ItemTemplate>
        </GridView>

И вот так выглядит мой коддля Rectangle:

<Rectangle x:Name="StatusColor" x:FieldModifier="public" Margin="0,0,0,0" Height="218" VerticalAlignment="Top">
                    <Rectangle.Fill>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="#00000000" Offset="0.901"/>
                            <GradientStop Color="#CC17FF00" Offset="0"/>
                        </LinearGradientBrush>
                    </Rectangle.Fill>
                </Rectangle>

1 Ответ

0 голосов
/ 31 мая 2018

Это следующие строки:

 // Not a framework element or is null
 if (fe == null) return null;

Вы слишком рано выходите из цикла.Когда элемент i не является элементом фреймворка, вы должны просто проигнорировать его и перейти к следующему.

Поэтому вместо выхода, когда вы столкнетесь с элементом, не являющимся фреймворком, просто выполните только следующие строкикогда он один:

 if (fe != null)
 {
    // rest of checking
 }

или альтернативно:

 if (fe == null) continue;

РЕДАКТИРОВАТЬ
Небольшая доработка вашего кода:

    private T FindChildControl<T>(DependencyObject control, string ctrlName) 
         where T: FrameworkElement
    {
        int childNumber = VisualTreeHelper.GetChildrenCount(control);
        for (int i = 0; i < childNumber; i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(control, i);
            FrameworkElement fe = child as FrameworkElement;

            // Not a framework element or is null
            if (fe == null)
            {
                continue;
            }

            if (child is T && fe.Name == ctrlName)
            {
                // Found the control so return
                return (T)child;
            }
            else
            {
                // Not found it - search children
                T nextLevel = this.FindChildControl<T>(child, ctrlName);
                if (nextLevel != null)
                {
                    return nextLevel;
                }
            }
        }

        return null;
    }

следует вызывать с

Rectangle rec = FindChildControl<Rectangle>(GridView1, "StatusColor");

, чтобы получить правильный результат.По крайней мере, в моей тестовой ситуации (с настроенными параметрами).

Единственным реальным изменением было использование continue вместо return.Кроме того, я использовал дженерики для немедленного возврата правильного типа, не требуя приведения.

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