我在一个WPF应用中的Listbox里面有一个文本框和按钮,我有一个场景,当我点击按钮时,文本块需要处于编辑模式,按钮需要处于隐藏状态。现在,我有一个场景,当我点击按钮时,文本块需要处于编辑模式,按钮需要处于隐藏状态。一旦用户完成编辑(在文本框上调用了一个keyup事件),按钮需要处于可见模式.我在按钮上调用了一个点击事件并使其隐藏,现在我必须在点击事件函数里面访问文本框,使其处于可编辑模式(只读假)。同样,当我完成编辑后,我需要在文本框的Keyup事件处理程序中调用按钮,使按钮可见。但是我在后面的代码中没有得到控件.我知道列表视图的DataTemplate绑定导致了这个问题。所以为了使按钮可见,我做了下面的代码,它是工作的。
private void controlEdit_Click_1(object sender, RoutedEventArgs e)
{
var edtBtn = sender as Button;
if (edtBtn != null)
{
edtBtn.Visibility = Visibility.Hidden;
}
}
但是我不知道如何调用这个按钮在我的文本框里面的Keyup事件处理程序,以同样的方式调用文本框里面这个按钮的click事件处理程序。我的列表框XAML和KeyUp事件处理程序都在添加。
XAML
<ListBox x:Name="ElList" Height="auto" Width="300" Background="Transparent" DataContext="{Binding collec}" ItemsSource="{Binding collec}" Grid.Row="0" Margin="31 3" HorizontalAlignment="Left">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBox x:Name="controltext" Width="153.7" Height="24.4" BorderBrush="#ffffff" FontFamily= "{StaticResource MontserratMedium}" Padding="2 0 0 0 " Text="{Binding ElName, Mode=TwoWay}" VerticalAlignment="Center" IsReadOnly="False" KeyDown="controltext_KeyDown" KeyUp="controltext_KeyUp" LostKeyboardFocus="controltext_LostKeyboardFocus"/>
<Button x:Name="controlEdit" Style="{StaticResource ImageButtonStyle}" Margin="3 0 0 0 " Click="controlEdit_Click_1">
<Image x:Name="featherImg" Source="Resources\feather_edit-3.png" Height="11" Width="11"/>
</Button>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
TextBox KeyUp事件处理程序
private void controltext_KeyUp(object sender, KeyEventArgs e)
{
string NewName = ((System.Windows.Controls.TextBox)sender).Text;
//Make the button visble.
}
所以建议我一种方法,如何访问文本框里面的按钮点击事件处理程序和文本框里面的按钮KeyUp一样。
如果你知道视觉树的结构,就可以使用父属性和子属性来导航它。
private void controltext_KeyUp(object sender, KeyEventArgs e)
{
var textbox = (TextBox)sender;
var panel = (StackPanel)textbox.Parent;
var button = panel.Children.OfType<Button>().FirstOrDefault(b => b.Name == "controlEdit");
}
子女属性对于面板来说是有意义的,控件有内容,装饰器(如边框)有子女属性。