小编Dam*_*cus的帖子

WPF MouseDown事件不会在控件中到处触发

我目前正在与另一场WPF斗争作斗争,即mouseEvents.我基本上有一个非常简单的控件(Border包含一个Grid本身有一些TextBlocks).我想实现一个简单的行为:双击应该把控制进入编辑模式(这实际上隐藏了TextBlocksTextBoxes绑定到相同的数据.

没什么好看的吧?好吧,我还在挣扎.该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)

c# wpf events xaml mouseevent

22
推荐指数
1
解决办法
1万
查看次数

WPF使用的默认转换器列表?

哪里可以找到WPF的默认转换器列表?


在查看Google之后,我找不到WPF中实际包含的内容的详细列表,尤其是MSDN文档.只找到:

wpf converter

15
推荐指数
1
解决办法
6026
查看次数

如何删除SQL CE中表中的所有数据?

SQL CE不支持TRUNCATE命令.要清除表格,我必须使用DELETE.是否有更快/更好的方法来清除数据,然后执行以下命令?

DELETE FROM FooTable WHERE id !='ABC'
Run Code Online (Sandbox Code Playgroud)

sql-server-ce

13
推荐指数
1
解决办法
7万
查看次数

ListView:在资源字典中定义ItemsPanelTemplate

我有一个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)

wpf listview datatemplate mvvm itemspanel

9
推荐指数
1
解决办法
1万
查看次数

强制WPF DataGrid重新生成自己

我有一个自定义控件继承自DataGrid并且基本上是2D DataGrid(接受ItemsSource具有两个维度的,例如double[,]).

我添加了一个具体的DependencyPropertyColumnHeadersRowHeaders这样我就可以定义它们.

以下是它现在的工作原理:

  • 我将2D绑定ItemsSourceDataGrid
  • 包装器方法将使用此源将其转换为IEnumerable可绑定到实际数据网格的经典绑定ItemsSource
  • 每行/列自动生成的使用事件完成AutoGeneratingColumn&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)

data-binding wpf datagrid auto-generate

7
推荐指数
1
解决办法
5819
查看次数

自定义UserControl“ IsEnabled”数据绑定不起作用

我的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工作,因此我可能错过了一些重要的东西...

非常感谢您的宝贵时间 :-)

c# wpf binding mvvm isenabled

5
推荐指数
1
解决办法
5780
查看次数

使用WrapPanel为ListView.GroupStyle设置样式

好的,这是我非常简单的问题.

我有一个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)

wpf xaml listview styles controltemplate

5
推荐指数
1
解决办法
8508
查看次数

样式化在ContentPresenter中自动生成的文本块

正如我所看到的,很多人遇到了这个确切的问题,但我无法理解为什么我的情况不起作用而且它开始让我发疯.

上下文:我有一个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)

也不起作用.

然后,我试着玩这个 …

wpf datagrid datatemplate controltemplate

5
推荐指数
1
解决办法
2792
查看次数

在XAML中处理Button的Click事件?

这感觉就像一个非常基本的问题,但我相信有更好的方法来做到这一点.我有一个Button在我的UI,其选择特定的标签,火灾CommandViewModel

这是当前的代码(工作正常):

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)

c# wpf xaml

5
推荐指数
2
解决办法
4万
查看次数

比较字符串与!=运算符给出不同的结果?

我知道这可能听起来像一个非常愚蠢的问题,但我对这个问题没有答案.我们的一位用户最近报告了一个错误,我意识到有一些旧的代码正在使用!= string.EmptyIsNullOrEmpty().我修好它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() …

c# string-comparison comparison-operators

5
推荐指数
1
解决办法
72
查看次数