我目前正在与另一场WPF斗争作斗争,即mouseEvents.我基本上有一个非常简单的控件(Border包含一个Grid本身有一些TextBlocks).我想实现一个简单的行为:双击应该把控制进入编辑模式(这实际上隐藏了TextBlocks与TextBoxes绑定到相同的数据.
没什么好看的吧?好吧,我还在挣扎.该MouseDoubleClick链接到我UserControl时,我在控制点击(如,单击一个文本块)刚刚火灾.如果我点击之间的空白区域TextBlocks,则不会触发任何内容.不是MouseDown.
我怎么能让它工作,以便抓住每一次鼠标点击?我认为将MouseDown事件链接到a Border应该捕获边界上的每次点击但是......最终没有捕获到边框空白部分的点击.
这是我为您制作的一些代码草案:
XAML:
<StackPanel Orientation="Vertical">
<Border Height="400" Width="400" HorizontalAlignment="Center" VerticalAlignment="Center" BorderBrush="Black" BorderThickness="2"
MouseDown="Border_MouseDown" MouseUp="Border_mouseUp">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Text="BLUFF" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Text="BLUFF" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Text="BLUFF" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock …Run Code Online (Sandbox Code Playgroud) 哪里可以找到WPF的默认转换器列表?
在查看Google之后,我找不到WPF中实际包含的内容的详细列表,尤其是MSDN文档.只找到:
TypeConverter.SQL CE不支持TRUNCATE命令.要清除表格,我必须使用DELETE.是否有更快/更好的方法来清除数据,然后执行以下命令?
DELETE FROM FooTable WHERE id !='ABC'
Run Code Online (Sandbox Code Playgroud) 我有一个ListView,其布局看起来像一个Windows资源管理器视图(图标+一些细节),绑定到ViewModel中的某个列表.
我的目标是能够随时在资源管理器视图或经典视图之间切换.
我可以ItemsPanelTemplate直接在ListView.ItemsPanel字段中定义完全正确地显示布局的工作.现在,我想在资源中定义它,以便我能够在不同的视图中使用它,特别是在一个控件中,用户应该在Explorer视图或经典列表视图之间进行选择(默认渲染为一个列表)
你怎么做的?我无法定义任何ItemsPanelTemplate在我的ResourceDictionary,如果我定义DataTemplate它是不兼容的(虽然我认为遵循纯逻辑,ItemsPanelTemplate应该继承DataTemplate,但它实际上不是这样).
实际列表的代码段:
<ListView SelectionMode="Single"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Bottom"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ItemsSource="{Binding ListUserApps,
UpdateSourceTrigger=PropertyChanged}"
SelectedIndex="{Binding SelectedUserApp, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Background="White">
<ListView.ItemsPanel>
<ItemsPanelTemplate >
<WrapPanel Width="{Binding (FrameworkElement.ActualWidth),
RelativeSource={RelativeSource
AncestorType=ScrollContentPresenter}}"
ItemWidth="{Binding (ListView.View).ItemWidth,
RelativeSource={RelativeSource AncestorType=ListView}}"
ItemHeight="{Binding (ListView.View).ItemHeight,
RelativeSource={RelativeSource AncestorType=ListView}}" />
<!--MinWidth="{Binding ItemWidth,
RelativeSource={RelativeSource Self}}"-->
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Height="Auto" Width="150">
<Image Source="{Binding Path=Appli.AppType, Converter={StaticResource TypeToIconConverter}}" Margin="5"
Height="50" Width="50"/>
<StackPanel VerticalAlignment="Center" Width="90">
<TextBlock Text="{Binding Path=Appli.AppName}"
FontSize="13" HorizontalAlignment="Left" TextWrapping="WrapWithOverflow" …Run Code Online (Sandbox Code Playgroud) 我有一个自定义控件继承自DataGrid并且基本上是2D DataGrid(接受ItemsSource具有两个维度的,例如double[,]).
我添加了一个具体的DependencyProperty是ColumnHeaders与RowHeaders这样我就可以定义它们.
以下是它现在的工作原理:
ItemsSource到DataGridIEnumerable可绑定到实际数据网格的经典绑定ItemsSourceAutoGeneratingColumn&AutoGeneratingRow以定义它们的报头问题在这里:
当我初始化时DataGrid,一切正常.
之后,我的应用程序的一个用例定义只有列标题可以更改(通过修改 DependencyProperty ColumnHeaders
而且,无论我在这里做什么,DataGrid都不会重新自动生成其列(因此,标题不会以任何方式更改).
那么,有没有办法问DataGrid一些类似"嘿,我希望你从头重新开始并重新生成列"的方法?因为现在,我无法访问该AutoGeneratingColumn事件,并调用一个方法,例如InvalidateVisual只重绘网格(而不是重新生成列).
这里有什么想法?
我不确定我们是否需要一些代码但是...我会放一些所以没有人要求它:D
/// <summary>
/// IList of String containing column headers
/// </summary>
public static readonly DependencyProperty ColumnHeadersProperty =
DependencyProperty.Register("ColumnHeaders",
typeof(IEnumerable),
typeof(FormattedDataGrid2D),
new PropertyMetadata(HeadersChanged));
/// <summary>
/// Handler called when the binding on …Run Code Online (Sandbox Code Playgroud) 我的WPF应用程序现在有点问题...
我有一个用于编辑组件详细信息的自定义UserControl。它应该从未启用开始,并在用户选择要编辑的组件后立即启用。
问题是:IsEnabled属性甚至都不会更改。
这是我的代码:
<my:UcComponentEditor Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
IsEnabled="{Binding EditorEnabled}"
DataContext="{Binding VmComponent}" />
Run Code Online (Sandbox Code Playgroud)
EditorEnabled是我的ViewModel(VmComponent)中的一个属性,默认为false,当用户选择一个组件或创建一个组件时变为true
仅作记录,在我的ViewModel中:
private Boolean _editorEnabled = false;
public Boolean EditorEnabled
{
get { return _editorEnabled; }
set
{
_editorEnabled = value;
OnPropertyChanged("EditorEnabled");
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试启动我的应用程序时,UserControl正在启动...启用。我到处都添加了断点,EditorEnabled从一开始就是假的。
我也做了一件非常愚蠢的事情,试图弄清楚发生了什么:我创建了一个转换器(非常有用-将布尔值转换为布尔值-嗯),在其上设置一个断点,然后……代码从未到达。
<my:UcComponentEditor Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
IsEnabled="{Binding EditorEnabled, Converter={StaticResource BoolConverter}}"
DataContext="{Binding VmComponent}" />
Run Code Online (Sandbox Code Playgroud)
这可能意味着永远不会设置属性isEnabled,因为永远不会到达转换器。
您在那看到任何问题吗?大约一周前,我开始在WPF工作,因此我可能错过了一些重要的东西...
非常感谢您的宝贵时间 :-)
好的,这是我非常简单的问题.
我有一个ListView我设计的样式,使它看起来像Windows资源管理器.
现在,我想将内容分组.因此,我定义了GroupStyle一个Expander用于对它进行分组.分组现在很好.
我不喜欢的是,现在,我将ListView每个组显示在一个单独的行上,而我希望有一些扩展器包装,以便在同一行上显示多个组.
我认为图像比某些文字更好.
这是我有的:

这就是我想要的:

我找不到要设置样式的属性,以便GroupItems在WrapPanel中进行调整,就像我对项目所做的那样.
这是我的ListView样式:
<ResourceDictionary>
<!-- Explorer-style layout-->
<DataTemplate x:Key="ExplorerView">
<StackPanel Orientation="Horizontal" Height="Auto" Width="150">
<Image Source="{Binding Path=Value.AppConfig.Appli.AppType, Converter={StaticResource TypeToIconConverter}}" Margin="5"
Height="50" Width="50"/>
<StackPanel VerticalAlignment="Center" Width="90">
<TextBlock Text="{Binding Path=Value.AppConfig.Appli.AppName}"
FontSize="13" HorizontalAlignment="Left" TextWrapping="WrapWithOverflow"
Margin="0,0,0,1" />
<TextBlock Text="{Binding Path=Value.AppConfig.Appli.AppType}" FontSize="9"
HorizontalAlignment="Left" Margin="0,0,0,1" />
</StackPanel>
</StackPanel>
</DataTemplate>
<!-- Group header style-->
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander x:Name="exp" IsExpanded="True" Width="310"
BorderBrush="CornflowerBlue">
<Expander.Header>
<DockPanel HorizontalAlignment="Stretch" …Run Code Online (Sandbox Code Playgroud) 正如我所看到的,很多人遇到了这个确切的问题,但我无法理解为什么我的情况不起作用而且它开始让我发疯.
上下文:我有一个DataGrid根据每个单元格的值着色的.因此,我有一个动态样式解析用于每个单元格的实际模板.背景现在相应地起作用.
新问题:当我有一个深色背景时,我希望字体颜色为白色,字体粗细为粗体,以便文本可以正确读取.而且......我无法正确设计它.
我读了一些关于它的Stackoverflow帖子:
这个适合我的问题,但没有提供任何工作解决方案 这一个也很清楚,细节但是...... 这个问题和我几乎一样但是......解决方案不起作用
这是我到目前为止尝试的内容:
<!-- Green template-->
<ControlTemplate x:Key="Green" TargetType="{x:Type tk:DataGridCell}">
<Grid Background="Green">
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ContentPresenter.Resources>
<Style BasedOn="{StaticResource BoldCellStyle}" TargetType="{x:Type TextBlock}" />
</ContentPresenter.Resources>
</ContentPresenter>
</Grid>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
不行.背景为绿色,但文字保持黑色而不是粗体.
BTW,BoldCellStyle尽可能简单:
<Style x:Key="BoldCellStyle" TargetType="{x:Type TextBlock}">
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="White" />
</Style>
Run Code Online (Sandbox Code Playgroud)
好的.第二次尝试(这是一个真正的愚蠢但很好......)
<!-- Green template -->
<ControlTemplate x:Key="Green" TargetType="{x:Type tk:DataGridCell}">
<Grid Background="Green">
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ContentPresenter.Resources>
<Style x:Key="BoldCellStyle" TargetType="{x:Type TextBlock}">
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="White" />
</Style>
</ContentPresenter.Resources>
</ContentPresenter>
</Grid>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
也不起作用.
然后,我试着玩这个 …
这感觉就像一个非常基本的问题,但我相信有更好的方法来做到这一点.我有一个Button在我的UI,其选择特定的标签,火灾Command从ViewModel
这是当前的代码(工作正常):
XAML:
<Button Content="Button!" Click="OnButtonClick" Command="{Binding WhateverCommand}" />
Run Code Online (Sandbox Code Playgroud)
代码背后:
private void OnButtonClick(object sender, RoutedEventArgs e)
{
theTab.IsSelected = true;
}
Run Code Online (Sandbox Code Playgroud)
是否有任何更清洁,仅限XAML的方式来进行UI操作?我在考虑这样的事情:
<Button Content="Button!" Click="OnButtonClick" Command="{Binding WhateverCommand}">
<Button.Triggers>
<EventTrigger RoutedEvent="Click">
<Setter TargetName="theTab" Property="IsSelected" Value="True" />
</EventTrigger>
</Button.Trigger>
</Button>
Run Code Online (Sandbox Code Playgroud)
但不幸的是,它似乎EventTrigger不会支持一个Click事件.为什么这样?在WPF工作几年后,我仍然有时会对触发器感到困惑,这几乎总结了它.在尝试构建时,我Setter在行上有错误:
A value of type 'Setter' cannot be added to a collection or dictionary of type 'TriggerActionCollection'.
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑,因为我问我的窗口的XAML结构,它看起来像这样:
<DockPanel LastChildFill="True">
<Ribbon DockPanel.Dock="Top">
<Button Content="Button!" Click="OnButtonClick" Command="{Binding WhateverCommand}" />
</Ribbon> …Run Code Online (Sandbox Code Playgroud) 我知道这可能听起来像一个非常愚蠢的问题,但我对这个问题没有答案.我们的一位用户最近报告了一个错误,我意识到有一些旧的代码正在使用!= string.Empty它IsNullOrEmpty().我修好它IsNullOrEmpty()现在运行正常,但我想真正理解这个问题
问题是,完全相同的代码在某些机器上的运行方式不同.我基本上有一个对象:context["MODE"]那应该是空的.我在它上面添加了一些测试来记录:
contextBuilder.AppendLine("MODE: |" + context["MODE"] + "|");
contextBuilder.AppendLine("MODE != string.Empty: " + (context["MODE"] != string.Empty));
contextBuilder.AppendLine("MODE TRIM != string.Empty: " + (context["MODE"].ToString().Trim() != string.Empty));
contextBuilder.AppendLine("MODE.IsNullOrEmpty: " + string.IsNullOrEmpty(context["MODE"].ToString()));
contextBuilder.AppendLine("MODE.TRIM.IsNullOrEmpty: " + string.IsNullOrEmpty(context["MODE"].ToString().Trim()));
Run Code Online (Sandbox Code Playgroud)
以下是我关于该字段详细信息的日志:
MODE: ||
MODE != string.Empty: False
MODE TRIM != string.Empty: False
MODE.IsNullOrEmpty: True
MODE.TRIM.IsNullOrEmpty: True
Run Code Online (Sandbox Code Playgroud)
这是他的日志:
MODE: ||
MODE != string.Empty: True
MODE TRIM != string.Empty: False
MODE.IsNullOrEmpty: True
MODE.TRIM.IsNullOrEmpty: True
Run Code Online (Sandbox Code Playgroud)
你可以看到有一点不同:MODE != string.Empty对我来说是假的(有道理),对他来说是对的!MODE显然不是null(否则.ToString() …
wpf ×8
c# ×4
xaml ×3
datagrid ×2
datatemplate ×2
listview ×2
mvvm ×2
binding ×1
converter ×1
data-binding ×1
events ×1
isenabled ×1
itemspanel ×1
mouseevent ×1
styles ×1