如何从@override
Widget build(BuildContext context){
return Column(
children: <Widget>[
_createWidget(() => FirstWidget()),
_createWidget(() => SecondWidget()),
],
);
}
Widget _createWidget(Widget Function() widgetBuilder) {
// ... other stuff...
return widgetBuilder();
}
控件中获取当前突出显示/选定的节点?根据文档here,应该可以遍历控件的TreeView
属性,但该属性始终为空。
编辑:事实证明,这是XAML的实际错误,由here跟踪。在解决之前,可以接受的答案可以很好地解决。
上下文:我正在开发一个简单的演示应用程序,以探索SelectedNodes
控件。我正在尝试添加键盘快捷键以删除当前活动/选定的节点。我在实现TreeView
的RelayCommand类中具有删除功能。我已经从ICommand
TreeViewItem
作为按钮和弹出菜单使用了它。我找不到在键盘快捷键中重用DataTemplate
的干净方法。
应用的图片,突出显示了最后单击的项目;我需要在后面的代码中访问此TreeViewItem,以便在TreeView具有焦点并按下“删除”键时可以将其删除。
我在ICommand
控件上有一个事件处理程序:
TreeView
事件处理程序应该遍历选定的节点,尽管我认为使用<controls:TreeView x:Name="TreeDataBound"
ItemsSource="{Binding Path=TreeSource, Mode=TwoWay}"
ItemTemplateSelector="{StaticResource TreeItemTemplateSelector}"
SelectionMode="Single"
KeyDown="Tree_KeyDown">
时,可枚举应该只有一项。
SelectionMode="Single"
private void Tree_KeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.Key == Windows.System.VirtualKey.Delete)
{
foreach (var element in TreeDataBound.SelectedNodes)
{
// Delete the item
}
}
}
似乎始终为空,即使突出显示了TreeView元素之一。在调试器中,SelectedNodes
显示为SelectedNodes
类型,没有可访问的属性,因此我无法对其进行进一步检查。
对更好的方法有任何想法或建议吗?
答案 0 :(得分:0)
UWP从TreeView控件中获取选定的节点
用于单选模式。 TreeViewItem
包含IsSelected
属性,您可以使用IsSelected
创建模型类并将其绑定。选定项目IsSelected
的值将被更改,因此您可以为每个项目源输入然后删除选定的项目。请参考以下步骤。
背后的代码
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
DataSource = GetData();
}
private ObservableCollection<ExplorerItem> DataSource;
private ObservableCollection<ExplorerItem> GetData()
{
var list = new ObservableCollection<ExplorerItem>();
ExplorerItem folder1 = new ExplorerItem()
{
Name = "Work Documents",
Type = ExplorerItem.ExplorerItemType.Folder,
Children =
{
new ExplorerItem()
{
Name = "Functional Specifications",
Type = ExplorerItem.ExplorerItemType.Folder,
Children =
{
new ExplorerItem()
{
Name = "TreeView spec",
Type = ExplorerItem.ExplorerItemType.File,
}
}
},
new ExplorerItem()
{
Name = "Feature Schedule",
Type = ExplorerItem.ExplorerItemType.File,
},
new ExplorerItem()
{
Name = "Overall Project Plan",
Type = ExplorerItem.ExplorerItemType.File,
},
new ExplorerItem()
{
Name = "Feature Resources Allocation",
Type = ExplorerItem.ExplorerItemType.File,
}
}
};
ExplorerItem folder2 = new ExplorerItem()
{
Name = "Personal Folder",
Type = ExplorerItem.ExplorerItemType.Folder,
Children =
{
new ExplorerItem()
{
Name = "Home Remodel Folder",
Type = ExplorerItem.ExplorerItemType.Folder,
Children =
{
new ExplorerItem()
{
Name = "Contractor Contact Info",
Type = ExplorerItem.ExplorerItemType.File,
},
new ExplorerItem()
{
Name = "Paint Color Scheme",
Type = ExplorerItem.ExplorerItemType.File,
},
new ExplorerItem()
{
Name = "Flooring Woodgrain type",
Type = ExplorerItem.ExplorerItemType.File,
},
new ExplorerItem()
{
Name = "Kitchen Cabinet Style",
Type = ExplorerItem.ExplorerItemType.File,
}
}
}
}
};
list.Add(folder1);
list.Add(folder2);
return list;
}
private void Tree_KeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.Key == Windows.System.VirtualKey.Delete)
{
DeleteSelectItem(DataSource);
}
}
private ExplorerItem DeleteSelectItem(ObservableCollection<ExplorerItem> DataSource)
{
foreach (var item in DataSource)
{
if (item.IsSelected == true)
{
DataSource.Remove(item);
return item;
}
var FindResult = DeleteSelectItem(item.Children);
if (FindResult != null)
return FindResult;
}
return null;
}
}
public class ExplorerItem : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public enum ExplorerItemType { Folder, File };
public String Name { get; set; }
public ExplorerItemType Type { get; set; }
private ObservableCollection<ExplorerItem> m_children;
public ObservableCollection<ExplorerItem> Children
{
get
{
if (m_children == null)
{
m_children = new ObservableCollection<ExplorerItem>();
}
return m_children;
}
set
{
m_children = value;
}
}
private bool m_isExpanded;
public bool IsExpanded
{
get { return m_isExpanded; }
set
{
if (m_isExpanded != value)
{
m_isExpanded = value;
NotifyPropertyChanged("IsExpanded");
}
}
}
private bool m_isSelected;
public bool IsSelected
{
get { return m_isSelected; }
set
{
if (m_isSelected != value)
{
m_isSelected = value;
NotifyPropertyChanged("IsSelected");
}
}
}
private void NotifyPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
class ExplorerItemTemplateSelector : DataTemplateSelector
{
public DataTemplate FolderTemplate { get; set; }
public DataTemplate FileTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item)
{
var explorerItem = (ExplorerItem)item;
return explorerItem.Type == ExplorerItem.ExplorerItemType.Folder ? FolderTemplate : FileTemplate;
}
}
Xaml
<Page.Resources>
<DataTemplate x:Key="FolderTemplate" x:DataType="local:ExplorerItem">
<TreeViewItem
AutomationProperties.Name="{x:Bind Name}"
IsExpanded="{x:Bind IsExpanded,Mode=TwoWay}"
IsSelected="{x:Bind IsSelected,Mode=TwoWay}"
ItemsSource="{x:Bind Children}"
>
<StackPanel Orientation="Horizontal">
<Image Width="20" Source="../Assets/folder.png" />
<TextBlock Margin="0,0,10,0" />
<TextBlock Text="{x:Bind Name}" />
</StackPanel>
</TreeViewItem>
</DataTemplate>
<DataTemplate x:Key="FileTemplate" x:DataType="local:ExplorerItem">
<TreeViewItem AutomationProperties.Name="{x:Bind Name}" IsSelected="{x:Bind IsSelected,Mode=TwoWay}">
<StackPanel Orientation="Horizontal">
<Image Width="20" Source="../Assets/file.png" />
<TextBlock Margin="0,0,10,0" />
<TextBlock Text="{x:Bind Name}" />
</StackPanel>
</TreeViewItem>
</DataTemplate>
<local:ExplorerItemTemplateSelector
x:Key="ExpolrerItemTemplateSelector"
FileTemplate="{StaticResource FileTemplate}"
FolderTemplate="{StaticResource FolderTemplate}"
/>
</Page.Resources>
<Grid>
<TreeView
x:Name="TreeDataBound"
HorizontalAlignment="Center"
VerticalAlignment="Top"
ItemTemplateSelector="{StaticResource ExpolrerItemTemplateSelector}"
ItemsSource="{x:Bind DataSource,Mode=OneWay}"
KeyDown="Tree_KeyDown"
SelectionMode="Single"
/>
</Grid>
有关完整的代码示例,请参阅此link。
答案 1 :(得分:0)
此问题已得到解决,但在您照常创建 uwp 应用程序时并未“启用”。
您需要修改一些代码行以启用较新版本的 xaml。
首先,按照此页面上的说明进行操作:https://docs.microsoft.com/en-us/windows/apps/winui/winui2/getting-started .在您的项目中安装最新的包。
然后将 xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
或 using muxc = Microsoft.UI.Xaml.Controls;
添加到您想要使用来自最新包的新控件的任何 Xaml/CS 文件。
示例可以在 :https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/tree-view 中找到。
总之,将 muxc:
添加到每个 <TreeView>
中,使它们变为 <muxc:TreeView>
(对于除数据模板之外的每个子项也是如此)。
然后在后面的 cs 代码中,使用 muxc.TreeViewxxx
而不是默认命名空间。
我不是 C# 或 VS 方面的专家,这个答案可以改进或有不必要的说明,但它现在对我有用。