Доступ к общедоступному методу из класса внутри 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();
}