小编dev*_*xer的帖子

如何将BitmapImage从后台线程传递到WPF中的UI线程?

我有一个生成一系列BitmapImage对象的后台线程.每次后台线程完成生成位图时,我想向用户显示此位图.问题是弄清楚如何BitmapImage将后台线程传递给UI线程.

这是一个MVVM项目,所以我的视图有一个Image元素:

<Image Source="{Binding GeneratedImage}" />
Run Code Online (Sandbox Code Playgroud)

我的视图模型有一个属性GeneratedImage:

private BitmapImage _generatedImage;

public BitmapImage GeneratedImage
{
    get { return _generatedImage; }
    set
    {
        if (value == _generatedImage) return;
        _generatedImage= value;
        RaisePropertyChanged("GeneratedImage");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的视图模型也有创建后台线程的代码:

public void InitiateGenerateImages(List<Coordinate> coordinates)
{
    ThreadStart generatorThreadStarter = delegate { GenerateImages(coordinates); };
    var generatorThread = new Thread(generatorThreadStarter);
    generatorThread.ApartmentState = ApartmentState.STA;
    generatorThread.IsBackground = true;
    generatorThread.Start();
}

private void GenerateImages(List<Coordinate> coordinates)
{
    foreach (var coordinate in coordinates)
    {
        var backgroundThreadImage = GenerateImage(coordinate); …
Run Code Online (Sandbox Code Playgroud)

c# wpf multithreading mvvm

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

在WPF样式中绑定会导致莫名其妙的"无法找到管理FrameworkElement"错误

我有一个ItemsControl显示一堆矩形.每个矩形需要向上和向左偏移.所以,我创建了一个RectangleStyle使用绑定来设置矩形的宽度,高度,X平移和Y平移.

宽度和高度绑定工作正常,但我得到TranslateTransform绑定的以下错误:

System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement.BindingExpression:路径= Offset.X; 的DataItem = NULL; target元素是'TranslateTransform'(HashCode = 16452547); target属性为'X'(类型'Double')

这是我的定义ItemControl:

<ItemsControl
    Style="{StaticResource ItemsControlStyle}"
    ItemsSource="{Binding Zones}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Rectangle Style="{StaticResource RectangleStyle}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

这是以下定义ItemsControlStyle:

<Style x:Key="ItemsControlStyle" TargetType="ItemsControl">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style>
                <Setter Property="Canvas.Left" Value="{Binding Point.X}" />
                <Setter Property="Canvas.Top" Value="{Binding Point.Y}" />
            </Style>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

以下是定义RectangleStyle:

<Style x:Key="RectangleStyle" TargetType="Rectangle">
    <Setter Property="Width" Value="{Binding Size.Width}" />
    <Setter Property="Height" …
Run Code Online (Sandbox Code Playgroud)

data-binding wpf xaml binding

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

如果我将我的数组,集合,列表,枚举等命名为它们包含的复数,那么坏事会发生在我身上吗?

我一直认为明确命名我的集合变量是"最佳实践".所以,如果我有一个Car对象的集合,我通常会命名为a Car[] carArray和a List<Car> carList.

然后99%的时间,我最终做了类似...

foreach (Car car in carArray)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

......而且我在想,我本来可以调用数组cars,但它不会产生任何影响.

现在我们有了IEnumberable<T>,我实际上面临的问题是我是否可以考虑写一些类似的东西carIEnumerable?或carEnumerable.到目前为止,答案一直是"不".

我在这里的想法是,集合的类型通常无关紧要,如果将集合类型写入变量名称仍然无关紧要.我只是遇到了一个必须从IEnumerable<Car>a 切换到a的情况,List<Car>因为我需要对项目进行"括号访问"(例如carList[3]).在这种情况下,两种集合类型的行为不一样,但是命名变量cars在这里是一个问题吗?

不要在这个问题上添加另一层复杂性,如果我使用会发生什么var?例如,

var cars = GetCars();
Run Code Online (Sandbox Code Playgroud)

我当然可以说cars是某种收藏品.我可以迭代它.如果我使用LINQ,我可以使用扩展方法.更重要的是,如果我后来更改了集合的类型,那么代码就会少得多.var仍然会var,cars现在仍然如此cars.这似乎对我很有吸引力,而且我很难看到很多劣势.

所以,只是为了确保我的问题清楚:你如何命名你的收集变量以及为什么?仅仅"复制"项目名称是否存在严重的可读性或清晰度成本?

c# linq naming naming-conventions

21
推荐指数
8
解决办法
1565
查看次数

如何在XAML声明的Label中强制换行两个单词?

也许我没有使用正确的关键词,但我所有的搜索都是空的.你怎么强行断线?

我可以告诉你,以下工作都没有:

<Label
    Content="Line&br;Break:" />

<Label
    Content="Line<br />Break:" />

<Label
    Content="Line
    Break:" />

<Label
    Content="Line\nBreak:" />
Run Code Online (Sandbox Code Playgroud)

有人可以分享这个严密保密的秘密吗?

谢谢.


编辑:

好的没关系.我终于找到了.

<Label
    Content="Line&#x0a;Break:" />
Run Code Online (Sandbox Code Playgroud)

绝对不容易猜到!


编辑2:

好的,现在为了使文本正确,我接受了这个:

<Label>
    <TextBlock
        TextAlignment="Right"
        Text="Line&#x0a;Break:" />
</Label>
Run Code Online (Sandbox Code Playgroud)

感谢Julien使用TextBlock的想法.

wpf xaml

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

我的WPF样式设置器可以使用TemplateBinding吗?

我正在尝试这样做......

<Style
    x:Key="MyBorderStyle"
    TargetType="Border">
    <Setter
        Property="BorderBrush"
        Value="{StaticResource MyBorderBrush}" />
    <Setter
        Property="Background"
        Value="{StaticResource MyBackgroundBrush}" />
    <Setter
        Property="Padding"
        Value="{TemplateBinding Padding}" />
</Style>
Run Code Online (Sandbox Code Playgroud)

...但我收到错误: 'Padding' member is not valid because it does not have a qualifying type name.

我如何提供"合格类型名称"?

注意:我试图这样做的原因是,我想在一系列类似的ControlTemplates中包含相同的Border.

谢谢.

编辑:

好吧,我试过这个......

<Setter
    Property="Padding"
    Value="{TemplateBinding GridViewColumnHeader.Padding}" />
Run Code Online (Sandbox Code Playgroud)

......它实际编译了,但是当我运行应用程序时,我得到了XamlParseException:

Cannot convert the value in attribute 'Value' to object of type ''.

我想,也许有资格PaddingGridViewColumnHeader(这是我想用这种风格与控件模板)的工作,但没有骰子.

编辑2:

那么,根据文档TemplateBinding,它说:

将控件模板中的属性值链接为模板化控件上某些其他公开属性的值.

所以听起来我正在尝试做的事情显然是不可能的.我真的希望能够为我的控件模板中的某些控件创建可重用的样式,但我想模板绑定不能包含在这些样式中.

wpf xaml styles templatebinding

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

C#中常量类的命名约定:复数还是单数?

这些指南对于列举很清楚......

对枚举使用单数名称,除非其值为位字段.

(来源:http://msdn.microsoft.com/en-us/library/ms229040.aspx)

...但对于一类常量(或只读静态字段/属性)则不那么清楚.例如,这个类的名称应该是单数还是复数?

public static class Token // or Tokens?
{
    public const string Foo = "Foo";
    public const string Bar = "Bar";
    public const string Doo = "Doo";
    public const string Hicky = "Hicky";
}
Run Code Online (Sandbox Code Playgroud)

c# coding-style naming-conventions

20
推荐指数
2
解决办法
4997
查看次数

当"更喜欢组合而不是继承"时生成传递代码

问题

假设我试图将手机模型化为普通手机和PDA的组合.这是一种多重继承方案(手机手机,它 PDA).由于C#不支持多重继承,因此这几乎需要某种组合.另外,让我们说我还有其他理由支持作曲.

我一直想知道:是否有任何工具可以自动生成所有不可避免的传递代码?

让我用一些实际的代码充实我的例子:

接口:

public interface IPhone
{
    public void MakeCall(int phoneNumber);
    public void AnswerCall();
    public void HangUp();
}

public interface IPda
{
    public void SendEmail(string[] recipientList, string subject, string message);
    public int LookUpContactPhoneNumber(string contactName);
    public void SyncWithComputer();
}
Run Code Online (Sandbox Code Playgroud)

实现:

public class Phone : IPhone
{
    public void MakeCall(int phoneNumber) { // implementation }
    public void AnswerCall() { // implementation }
    public void HangUp() { // implementation }
}

public class Pda : IPda
{ …
Run Code Online (Sandbox Code Playgroud)

c# code-generation design-patterns visual-studio

19
推荐指数
1
解决办法
3086
查看次数

SQLite中有任何保留字吗?

关于保留字的三个问题:

  1. SQLite中有任何保留字吗?如果是这样,他们是什么?

  2. 如果有保留字,是否使用其中一个作为列或表名仍然用括号括起来的正确语法?例如,[User]还是[Name]

  3. 使用ADO.NET查询SQLite数据库时,使用其他SQL语言(例如SQLServer)保留但在SQLite中没有保留的单词是否有任何影响?

sqlite ado.net

19
推荐指数
1
解决办法
8889
查看次数

现在已经发布了Entity Framework 4.0的Linq-To-Sql?

Linq-To-Sql的相对简单性以及对实体框架版本1的所有批评(尤其是不信任投票)使我确信"暂时"使用Linq-To-Sql.现在EF 4.0已经用完了,我想知道是不是该开始迁移到它了.

问题:

  1. EF 4.0相对于Linq-To-Sql的优点和缺点是什么?
  2. EF 4.0终于准备好迎接黄金时段吗?
  3. 现在是时候切换了吗?

orm entity-framework linq-to-sql entity-framework-4

17
推荐指数
1
解决办法
2294
查看次数

为什么var在"foreach(table.Rows中的var row)"中评估为System.Object?

当我进入这个foreach声明时......

foreach (var row in table.Rows)
Run Code Online (Sandbox Code Playgroud)

... var的工具提示说 class System.Object

我很困惑为什么不是class System.Data.DataRow.

(如果你想知道,是的,我using System.Data在我的代码文件的顶部.)


如果我明确声明类型,如...

foreach (DataRow row in table.Rows)
Run Code Online (Sandbox Code Playgroud)

...它没有错误,工作正常.


如果我这样做......

var numbers = new int[] { 1, 2, 3 };
foreach (var number in numbers)
Run Code Online (Sandbox Code Playgroud)

... var评估为struct System.Int32.所以,问题var不是在foreach子句中不起作用.


因此,DataRowCollection项目不会自动评估的位置有些奇怪DataRow.但我无法弄清楚它是什么.有人有解释吗?


更新

我真的被撕裂了对Mark的回答(Codeka和Oliver)......最后,我决定标记Codeka,因为它真的回答了我的问题,但Oliver回答了我应该问的问题:)

c# ado.net

17
推荐指数
2
解决办法
1423
查看次数