Доступ к общедоступному методу из класса внутри SurfaceListBox

Я создал решение WPF, как описано на https://msdn.microsoft.com/en-us/library/ff727730.aspx. Это решение предоставит мне непрерывный список, используя SurfaceListBox, Это работает нормально, без проблем.

Теперь я хотел бы нажать на изображение и переместить X пикселей в любом направлении.

Итак, я создал событие MainSurfaceListBox_OnSelectionChanged и добавил, что MainWindow.xaml:

<Window x:Class="ContinuousList.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:s="http://schemas.microsoft.com/surface/2008"
        xmlns:l="clr-namespace:ContinuousList"
        Title="ContinuousList" Height="640" Width="800">
    <Grid>

        <s:SurfaceListBox Name="MainSurfaceListBox"
                          SelectionChanged="MainSurfaceListBox_OnSelectionChanged">
            <s:SurfaceListBox.ItemTemplate>
                <DataTemplate>
                    <Image Source="{Binding}" Width="270"/>
                </DataTemplate>
            </s:SurfaceListBox.ItemTemplate>
            <s:SurfaceListBox.Template>
                <ControlTemplate>
                    <s:SurfaceScrollViewer
                        VerticalScrollBarVisibility="Disabled"
                        HorizontalScrollBarVisibility="Hidden"
                        CanContentScroll="true">
                        <l:LoopPanelVertical IsItemsHost="True"/>
                    </s:SurfaceScrollViewer>
                </ControlTemplate>
            </s:SurfaceListBox.Template>
        </s:SurfaceListBox>

    </Grid>
</Window>

и внутри MainWindow.xaml.cs

private void MainSurfaceListBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    //trying to call a public method from LoopPanelVertical
}

Теперь из MainWindow.xaml.cs Я пытаюсь запустить метод LoopPanelVertical.LineUp(), Моя проблема в том, что я не могу найти способ доступа к этому методу или любому общедоступному методу из LoopPanelVertical,

namespace ContinuousList
{
    public class LoopPanelVertical : Panel, ISurfaceScrollInfo
    {
        ...
        public void LineUp()
        {
             ScrollContent(1);
        }
    }
}

Пожалуйста, помогите мне понять, что нужно для этого? Спасибо!

2 ответа

Решение

Только что нашел ответ, используя дочерний элемент:

 private void MainSurfaceListBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var listBox = sender as SurfaceListBox;
            if (listBox == null) return;
            var childElement = FindChild(listBox, i => i as LoopPanelVertical);
            childElement.LineUp();
        }

        static T FindChild<T>(DependencyObject obj, Func<DependencyObject, T> pred) where T : class
        {
            var childrenCount = VisualTreeHelper.GetChildrenCount(obj);
            for (var i = 0; i < childrenCount; i++)
            {
                var dependencyObject = VisualTreeHelper.GetChild(obj, i);
                var foo = pred(dependencyObject);
                return foo ?? FindChild(dependencyObject, pred);
            }
            return null;
        }

Чтобы вызвать метод (не статического) класса, вам нужно иметь ссылку на экземпляр этого класса. Вы можете установить Name или же x:Name собственность вашего LoopPanelVertical класс, а затем использовать это имя для ссылки на него:

<ControlTemplate>
    <s:SurfaceScrollViewer
        VerticalScrollBarVisibility="Disabled"
        HorizontalScrollBarVisibility="Hidden"
        CanContentScroll="true">
        <l:LoopPanelVertical x:Name="Panel" IsItemsHost="True"/>
    </s:SurfaceScrollViewer>
</ControlTemplate>

...

private void MainSurfaceListBox_OnSelectionChanged(object sender, 
    SelectionChangedEventArgs e)
{
    Panel.LineUp();
}
Другие вопросы по тегам