小编She*_*dan的帖子

如何在C#6中使用带字符串插值的转义字符?

我一直在使用字符串插值并喜欢它,但我有一个问题,我试图在我的输出中包含反斜杠,但我无法让它工作.

我想要的是这样的......

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{domain}\{userName}"
Run Code Online (Sandbox Code Playgroud)

我想要组合的输出

myDomain\myUserName
Run Code Online (Sandbox Code Playgroud)

我得到的是关于\作为转义字符的语法错误.如果我输入\\那么snytax错误消失了,但输出是myDomain \\ myUsername

如何在插值字符串中包含转义字符?

.net c# string-interpolation

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

x:Reference和ElementName有什么区别?

根据MSDN上的x:Reference Markup Extension页面,x:Reference

引用在XAML标记中的其他位置声明的实例.引用引用元素的x:Name.

根据MSDN上的Binding.ElementName属性页面,ElementName

Name属性的值或x:感兴趣元素的Name Directive.

回顾第一页上的备注部分:

x:参考和WPF

在WPF和XAML 2006中,元素引用由ElementName绑定的框架级功能处理.对于大多数WPF应用程序和方案,仍应使用ElementName绑定.此一般指导的例外情况可能包括存在数据上下文或其他作用域考虑因素的情况,这些因素使得数据绑定不切实际且不涉及标记编译.

为了完整起见,这是ElementName页面上备注部分的一部分:

当您想要绑定到应用程序中另一个元素的属性时,此属性很有用.例如,如果要使用Slider控制应用程序中另一个控件的高度,或者要将控件的内容绑定到ListBox控件的SelectedValue属性.

现在,虽然我完全知道何时以及如何使用该ElementName属性,但我并不完全理解它与x:Reference标记扩展之间的区别.任何人都可以解释一下这个问题,特别是扩大x:Reference评论部分显示的最后一句话:

此一般指导的例外情况可能包括存在数据上下文或其他作用域考虑因素的情况,这些因素使得数据绑定不切实际且不涉及标记编译.

wpf markup xaml

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

ListBox与ItemTemplate(和ScrollBar!)

我有一个数据绑定和itemtemplated ListBox:

<ListBox x:Name="lbLista" 
         ScrollViewer.VerticalScrollBarVisibility="Visible">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel Orientation="Horizontal">
          <CheckBox IsChecked="{Binding Deleteable, Mode=TwoWay}" />
          <Label Content="{Binding Name}" />
        </StackPanel>
      </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)

它显示很好,它们来自ObservableCollection.

问题滚动条出现,但无法使用-它不会有一个把手抢.我已经尝试在ListBox上设置一些ScrollView附加属性,但它们不会影响这种情况.

wpf xaml scroll listbox

33
推荐指数
3
解决办法
10万
查看次数

CS1607:为'文件版本'指定的版本在.NET中不是正常的'major.minor.build.revision'格式

我试图把我AssemblyVersionAssemblyFileVersion我的项目属性,像这样:

[assembly: AssemblyVersion("3.0.*")]
[assembly: AssemblyFileVersion("3.0.*")]
Run Code Online (Sandbox Code Playgroud)

但我得到这个警告:

CS1607:程序集生成 - 为"文件版本"指定的版本"3.0.*"不是正常的"major.minor.build.revision"格式

AssemblyVersionAttribute ClassMSDN的页面上如下:

您可以指定所有值,也可以使用星号(*)接受默认的内部版本号,修订号或两者.例如,[assembly:AssemblyVersion("2.3.25.1")]表示2为主要版本,3表示次要版本,25表示构建号,1表示版本号.诸如[assembly:AssemblyVersion("1.2.*")]之类的版本号指定1作为主要版本,2作为次要版本,并接受默认的构建和修订号.诸如[assembly:AssemblyVersion("1.2.15.*")]之类的版本号指定1作为主要版本,2作为次要版本,15作为构建号,并接受默认修订号.

请注意粗体部分.有谁知道为什么[assembly: AssemblyVersion("3.0.*")](从我的项目)无效,但[assembly:AssemblyVersion("1.2.*")](从MSDN示例)是有效的?

特别是,我很想知道我是否可以从一个非零的主要数字开始,因为我正在编写的应用程序是该程序的第3版.

更新>>>对不起,这似乎在其他帖子中得到解答...请投票关闭它,谢谢.

.net warnings wildcard assemblyversionattribute

30
推荐指数
1
解决办法
9082
查看次数

使用MVVM绑定ComboBox SelectedItem

我的ComboBox中SelectedItem有问题.

<ComboBox Name="cbxSalesPeriods"
        ItemsSource="{Binding SalesPeriods}"
        DisplayMemberPath="displayPeriod"
        SelectedItem="{Binding SelectedSalesPeriod}"
        SelectedValuePath="displayPeriod"
        IsSynchronizedWithCurrentItem="True"/>
Run Code Online (Sandbox Code Playgroud)

这没什么好的 如果我打开ComboBox,我会看到值.

在此输入图像描述 如果我选择一个项目,则不会显示所选项目.

有人有想法吗?

在我的ViewModel中,我有以下两个属性:

public ObservableCollection<SalesPeriodVM> SalesPeriods { get; private set; }

private SalesPeriodVM selectedSalesPeriod;
public SalesPeriodVM SelectedSalesPeriod
{
    get { return selectedSalesPeriod; }

    set 
    {
        if (selectedSalesPeriod != value)
        {
            selectedSalesPeriod = value;
            RaisePropertyChanged("SelectedSalesPeriod");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是该类的一些属性:

public SalesPeriodVO Vo
{
    get { return period; }
}

public int Year
{
    get { return period.Year; }
    set
    {
        if (period.Year != value)
        {
            period.Year …
Run Code Online (Sandbox Code Playgroud)

c# data-binding wpf binding mvvm

29
推荐指数
2
解决办法
13万
查看次数

如何在ItemsControls中使用AlternationIndex?

我已经看到一些文章,展示了如何使用AlternationIndexListBoxES或ListViewS,但我花了几个小时试图让基交替背景色ItemsControl类和似乎没有任何工作.ListBox我看到的所有样本都ListBoxItem用作设置背景的样式的目标类型AlternationIndex- 就像MSDN中的这样:

<Grid>
    <Grid.Resources>
        <Style x:Key="alternatingWithTriggers" TargetType="{x:Type ListBoxItem}">
            <Setter Property="Background" Value="Blue"/>
            <Setter Property="Foreground" Value="White"/>
            <Style.Triggers>
                <Trigger Property="ListBox.AlternationIndex" Value="1">
                    <Setter Property="Background" Value="CornflowerBlue"/>
                    <Setter Property="Foreground" Value="Black"/>
                </Trigger>
                <Trigger Property="ListBox.AlternationIndex" Value="2">
                    <Setter Property="Background" Value="LightBlue"/>
                    <Setter Property="Foreground" Value="Navy"/>
                </Trigger>
            </Style.Triggers>
        </Style>

    </Grid.Resources>
    <ListBox AlternationCount="3" ItemsSource="{StaticResource data}" 
             ItemContainerStyle="{StaticResource alternatingWithTriggers}">
    </ListBox>
</Grid>
Run Code Online (Sandbox Code Playgroud)

我想使用它,ItemsControl因为我不想要选择功能,我认为重新设置a ListBox来隐藏它可能不是最好的选择.

这是我尝试的事情之一:

<DataTemplate DataType="{x:Type vm:ObservableCollectionItem}">
    <Grid>
        <!-- some content here -->
    </Grid>
</DataTemplate>

<!-- …
Run Code Online (Sandbox Code Playgroud)

wpf styles itemscontrol mvvm

27
推荐指数
3
解决办法
2万
查看次数

使用nameof运算符而不是CallerMemberNameAttribute来通知.NET 4.5.3中的属性更改有什么好处?

随着.NET 4.5.3的出现,WPF开发人员现在有三种(或更多)方法来通知INotifyPropertyChanged接口属性更改.基本上,我的问题是从.NET 4.5开始引入的两种方法中哪一种是更有效的方式来通知属性更改以及在WPF中使用时这两种方式是否有任何好处?

背景

对于那些不太熟悉这个主题的人,这里有三个主要方法.第一个是简单传递字符串的原始的,更容易出错的方法:

public string TestValue
{
    get { return testValue; }
    set { testValue = value; NotifyPropertyChanged("TestValue"); }
}

protected virtual void NotifyPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种方法是在.NET 4.5中引入的; 的CallerMemberNameAttribute:

public string TestValue
{
    get { return testValue; }
    set { testValue = value; NotifyPropertyChanged(); }
}

protected virtual void NotifyPropertyChanged([CallerMemberName]string propertyName = "")
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); …
Run Code Online (Sandbox Code Playgroud)

c# callermembername c#-6.0 .net-4.6 nameof

22
推荐指数
2
解决办法
5148
查看次数

为什么WPF应用程序在Windows 7和Windows 8之间看起来有所不同,这可以修复吗?

我真的很惊讶这个问题似乎还没有被问到......如果有的话,但是我找不到它,道歉.

好的,所以我的工作计算机刚刚从Windows 7升级到Windows 8.令我非常恐怖的是,我的WPF应用程序在几个方面看起来有所不同......不同,我的意思是更糟糕的是,丑陋,控件没有正确排列等等.这是一个例子:

Windows 7的:

在此输入图像描述

Windows 8:

在此输入图像描述

Windows 8问题(仅从此图像):

  • 错误的标题栏包括按钮(最小化,关闭等)
  • 标题栏中的字体大小错误
  • 标题中的FontWeight错误(Windows 7 SemiBold设置= Windows 8粗体设置)
  • 标题栏中的图标(或文本)未对齐
  • 标题栏中的图标非常模糊
  • 错误的填充和/或边距设置将左侧的项目隔开
  • 错误的填充和/或边距设置会缩小右侧的文本框高度
  • 左侧项目的"隐藏"默认选择颜色不再隐藏
  • 回到正面复选框勾选
  • 某些按钮上的图像非常模糊

所以,我的问题是:

为什么WPF应用程序在Windows 7和Windows 8之间看起来有所不同,这可以修复吗?

为了澄清这一点,我不是在两个操作系统上的WPF之间的差异列表之后.我也没有修复上面列出的各个点.我想让某人解释为什么这些UI看起来不同,例如.是什么导致了这些差异.我也听说过WPF中的一些系统设置,这使我能够让PC渲染应用程序就像在Windows 7上一样,但我不知道它是多么真实.


更新>>>

正如@AndrasSebö亲切地指出的那样,WPF有一个名为Windows 7主题的StackOverflow问题,它修复了Windows XP的类似问题.不幸的是,它似乎对Windows 8没有任何影响.是否有任何微软用户确实知道实施了哪些差异导致此问题?还是有人?


更新2 >>>

好了,经过一番更多的测试,我开始认为这个问题是相关的Windows主题.使用@ Gusdor答案中提供的代码,我尝试将主题更改为,Aero并没有明显的区别......这让我思考.然后我将其更改Luna为测试该代码并且它有效.

通过'工作',我的意思是Windows主题改变了,但UI控制,或更准确地说,不正确PaddingMargin保持.然后我尝试将主题更改为Luna使用@AndrasSebö提到的XAML方法,同样的事情发生了... ScrollBars看起来不同,所以我可以看到主题已经改变,但问题仍然存在.

所以现在我认为这可能与我正在研究的这是一台全新的计算机这个事实有关...可能有一些我需要安装的dll或设置?我真的只是在这里猜测 - 我将整个Microsoft .NET Framework安装到版本4.5.1,因为我在Windows 8.1上.

这是一个绝对的噩梦,因为我没有时间去修复这个大型应用程序中的每个视图.如果可以的话请帮忙.

windows wpf render difference

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

在WPF中使用MVVM,我应该从后面的View代码或ViewModel启动子窗口吗?

我有一段时间对此感到困惑.我正在RibbonWindow使用MVVM模式编写相当大的WPF应用程序.屏幕RibbonBar顶部有一个菜单,其余部分显示各种视图.某些视图包含其他视图,其中一些视图具有启动子窗口的按钮.

到目前为止,我一直在使用View代码隐藏文件执行此操作,但我知道在使用MVVM时这些文件应该是空的.我可以将子窗口启动代码移动到ViewModel,但是我需要一个对main的引用RibbonWindow(设置为子窗口所有者),这似乎不正确.

关于如何使用MVVM正常实现这一建议或提示将不胜感激.

wpf view mvvm childwindow viewmodel

18
推荐指数
2
解决办法
7796
查看次数

WPF TextBox输入十进制值

是否有任何体面的方法来获得绑定到十进制值的WPF控件?

当我将TextBox或DataGridTextColumn绑定到小数时,数据条目会耗费大量时间.

<TextBox Text="{Binding MyDecimal, UpdateSourceTrigger=PropertyChanged, 
    ValidatesOnDataErrors=True}"/>
Run Code Online (Sandbox Code Playgroud)

当我尝试在此TextBox中输入"0,5"时,我将得到"5".根本不可能输入"0,5"(除了输入1,5并用"0"替换"1").

当我使用StringFormat时,数据输入仍然很少:

<TextBox Text="{Binding MyDecimal, StringFormat=F1, UpdateSourceTrigger=PropertyChanged,
    ValidatesOnDataErrors=True}"/>
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试输入"0,5"时,我最终会得到"0,5,0",这仍然是错误的,但至少我可以删除尾随的"0"而没有太多问题.

尽管如此,使用WPF输入小数会吸引大量时间,因为此输入字段非常容易出现数据输入错误,这对于值来说尤其令人痛苦!

那么我应该用什么来为wpf中的十进制数据输入?或者微软不支持十进制数据?

wpf decimal data-entry

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