我正在寻找一种方法来查找Window类型的所有控件,
例如:查找全部TextBoxes,找到实现特定接口的所有控件等.
问题:
如果我DataGrid不完全可见(显示水平和垂直滚动条)并且我单击其中一个部分可见的单元格,则网格会自动滚动以将该单元格显示在视图中.我不希望这种情况发生.我试过玩RequestBringIntoView,像这样:
private void DataGrid_RequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
{
e.Handled = true;
}
Run Code Online (Sandbox Code Playgroud)
但这没有任何作用.
我试过的事情:
UserControls; 我试图把一个事件处理程序RequestBringIntoView上的所有UserControls使我的细胞,并试图处理事件,想,也许我是不是只是处理做得不够RequestBringIntoView的DataGrid本身.这没用.DataGrid一个内部的ScrollViewer,而办理ScrollViewer的RequestBringIntoView事件.这实际上是有效的,并且停止了自动滚动行为,但在我的情况下托管一个DataGrid内部ScrollViewer是完全不可取的,所以我需要提出一个不同的解决方案.我不知道如何阻止这种行为,任何想法?
如果我有一个派生的组件ItemsControl,我可以访问它的子集合,以便我可以循环它们来执行某些操作吗?我现在似乎找不到任何简单的方法.
我正在查看这个问题,并发现绑定Label.Content到非字符串值将应用隐式TextBlock样式,但是绑定到字符串则不会.
以下是重现问题的示例代码:
<Window.Resources>
<Style TargetType="Label">
<Setter Property="FontSize" Value="26"/>
<Setter Property="Margin" Value="10"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontSize" Value="26"/>
<Setter Property="Margin" Value="10"/>
</Style>
</Window.Resources>
<Grid>
<StackPanel Orientation="Horizontal">
<Label Content="{Binding SomeString}" Background="Red"/>
<Label Content="{Binding SomeDecimal}" Background="Green"/>
</StackPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)
绑定值的代码是
SomeDecimal = 50;
SomeString = SomeDecimal.ToString();
Run Code Online (Sandbox Code Playgroud)
最终结果如下所示,Margin隐式TextBlock样式的属性应用于仅绑定到非字符串的Label:

两个标签都呈现为
<Label>
<Border>
<ContentPresenter>
<TextBlock />
</ContentPresenter>
</Border>
</Label>
Run Code Online (Sandbox Code Playgroud)
当我使用Snoop检查VisualTree时,我可以看到它对于两个元素看起来完全相同,除了第二个TextBlock从隐式样式应用Margin,而第一个没有.

我已经使用Blend来提取默认标签模板的副本,但是没有看到任何奇怪的东西,当我将模板应用于我的两个标签时,同样的事情发生了.
<Label.Template>
<ControlTemplate TargetType="{x:Type Label}">
<Border BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
Padding="{TemplateBinding …Run Code Online (Sandbox Code Playgroud) 我有一个WPF DataGrid,当屏幕上有太多行要查看时,它会得到一个垂直滚动条.我想知道的是,如果有一种方法可以知道用户滚动时顶部可见行是什么.
理想情况下,我希望能够连接事件以了解用户何时滚动和滚动,检查顶部可见行是什么以更新某些信息.
我不知道为什么但由于某种原因我无法在我的代码隐藏文件中引用我的tbText控件.这是XAML部分:
<ComboBox.ItemTemplate>
<DataTemplate>
<ItemsControl x:Name="ic">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="2*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
</Grid>
**<TextBlock x:Name="tbText" Grid.Column="0" Grid.Row="0" Margin="10" />**
<Image Grid.Column="1" Margin="10" Grid.Row="0" Width="100" Height="100" Stretch="Fill">
</Image>
</ItemsControl>
</DataTemplate>
</ComboBox.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)
我不能参考"tbText"控件.