小编Run*_*sen的帖子

如何在WPF中获取控件以填充可用空间?

Button如果你没有指定它的高度,一些WPF控件(比如)似乎很乐意消耗它'容器中的所有可用空间.

还有一些,比如我现在需要使用的那些,(多线)TextBox而且ListBox似乎更担心只需占用适合其内容所需的空间,而不是更多.

如果你将这些人放在一个单元格中UniformGrid,它们将扩展以适应可用空间.但是,UniformGrid实例并不适合所有情况.如果你有一个网格,其中一些行设置为*高度,以划分自身与其他*行之间的高度,该怎么办?如果你有一个StackPanel,你有a Label,a List和a Button,你怎么能得到列表占据标签和按钮没有吃掉的所有空间怎么办?

我认为这确实是一个基本的布局要求,但我无法弄清楚如何让它们填充他们可以填充的空间(将它们放入并将其DockPanel设置为填充也不起作用,似乎,因为在DockPanel只占用其子控件所需的空间).

一个可调整大小的GUI将是相当可怕的,如果你有一起玩Height,Width,MinHeight,MinWidth等.

你可以绑定你HeightWidth属性,以你占据网格单元?或者还有另一种方法吗?

wpf layout user-interface

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

WPF数据绑定到接口而不是实际对象 - 可能吗?

说我有这样的界面:

public interface ISomeInterface
{
...
}
Run Code Online (Sandbox Code Playgroud)

我还有几个实现这个接口的类;

public class SomeClass : ISomeInterface
{
...
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个WPF ListBox列出了ISomeInterface的项目,使用自定义DataTemplate.

数据绑定引擎显然不会(我已经弄明白)允许我绑定到接口属性 - 它看到该对象是一个SomeClass对象,并且数据只显示SomeClass应该碰巧有绑定属性可用非接口属性.

我怎么能告诉DataTemplate好像每个对象都是一个ISomeInterface,而不是SomeClass等?

谢谢!

c# data-binding wpf

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

我应该在哪里注射Ninject 2+(我如何安排我的模块?)

我有一个解决方案,有两个相关的(对这个问题)项目,还有一些其他项目;

  1. 具有其他几个项目使用的功能的类库.
  2. ASP.NET MVC应用程序.

我的问题基本上是我应该使用Ninject 2做IoC,考虑到......

  • 类库需要一些DI爱,其中包括需要Web请求特定会话对象的存储库类(想想工作单元).
  • MVC应用程序需要DI,因为在Ninject 2中你基本上都是从NinjectHttpApplication继承的.
  • 类库的单元测试需要注意这一点,以注入一组不同的存储库.
  • 出于同样的原因,需要注入Web应用程序的单元测试.

我把自己画成了一个心理角落,因为我只看到了三个选项.类库中的DI,Web应用程序中的DI,或两者都有,但每个都有问题:

  • 我不能在类库中做DI ,因为MVC应用程序需要从NinjectHttpApplication继承而开始.
  • 我不能只在MVC应用程序中执行DI - 毕竟,类库是由其他库使用的,并且MVC应用程序不应该对库的内部结构有太多了解.
  • 我想这是我能看到的唯一出路:两个项目的独立IoC.类库和MVC应用程序都有自己的IoC设置,并为他们的东西做DI,而不是真正关心彼此.

有没有人对如何做这样的事情有一些"最佳实践"或指导方针?我无法想象我是第一个在这种情况下结束的人,而且知道"正确"的做法是什么肯定会很好......

谢谢!

asp.net-mvc ninject inversion-of-control

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

将一个或多个邮件从Outlook拖放到C#WPF应用程序

我正在使用带有C#的.Net 3.5 Sp1编写的WPF编写的Windows客户端,其中要求客户端收到的电子邮件中的数据可以存储在数据库中.现在,处理此问题的最简单方法是使用诱导关节炎的量ctrl-c/ctrl-v复制并粘贴手动接收的文本,主题,联系信息和时间.

我认为处理这种情况的一种简单方法是允许用户将一个或多个电子邮件从Outlook(它们都使用当前的Outlook 2007)拖到窗口中,允许我的应用程序提取必要的信息并将其发送到后端存储系统.

然而,几个小时的谷歌搜索信息似乎表明这个看似基本的任务令人震惊的缺乏信息.我认为这样的东西在许多不同的设置中会有用,但到目前为止我能找到的所有东西都是半生不熟的非解决方案.

有没有人对如何做到这一点有任何建议?因为我只是要阅读邮件而不是发送任何内容或做任何有害的事情,所以对于一个不涉及讨厌的安全弹出窗口的解决方案来说会很好,但是任何事情都无法完成.

基本上,如果我可以获得所有选中的邮件列表,从Outlook中拖放,我将能够自己处理其余的邮件!

谢谢!

符文

c# wpf outlook drag-and-drop

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

根据ListBox.SelectedIndex在WPF中启用按钮

我有一个相当经典的UI情况 - 两个ListBoxes命名SelectedItemsAvailableItems- 这个想法是你已经选择SelectedItems的项目存在,而可用于添加的项目SelectedItems(即每个尚未存在的项目)都存在AvailableItems.

此外,我有<>按钮将当前选择从一个列表移动到另一个列表(除了双击,它工作正常).

是否可以在WPF中设置样式/触发器以启用或禁用移动按钮,具体取决于在ListBox中选择的任何内容?SelectedItems在左侧,因此<按钮会将所选内容移动AvailableItems到该列表.但是,如果没有选择任何项目(AvailableItems.SelectedIndex == -1),我希望禁用此按钮(IsEnabled == false) - 而另一个列表/按钮则相反.

这可以直接在XAML中完成,还是需要在代码隐藏中创建复杂的逻辑来处理它?

wpf listbox

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

使用Fluent NHibernate进行映射时对接口进行编程

我已经被提交并已经开始学习Fluent NHibernate(没有以前的NHibernate经验).在我的项目中,我正在编程接口以减少耦合等.这意味着几乎所有"一切"都指的是接口而不是具体类型(IMessage而不是Message).这背后的想法是通过能够模拟依赖关系来帮助使其更易于测试.

然而,(流利的)当我尝试映射到接口而不是具体类时,NHibernate并不喜欢它.问题很简单 - 根据Fluent Wiki,定义我的类的ID字段是明智的

int Id { get; private set; }
Run Code Online (Sandbox Code Playgroud)

获取典型的自动生成的主键.但是,这只适用于具体的类 - 我不能在接口上指定访问级别,同一行必须是这样

int Id { get; set; }
Run Code Online (Sandbox Code Playgroud)

并且我认为否定在具体类中使setter私有(想法是只有NHibernate应该将ID设置为由DB分配).

就目前而言,我想我只会公开制定者并试图避免写入它的诱惑..但是有没有人知道什么是"正确的",最佳实践方式来创建一个正确的主键只有NHibernate可以写入的字段,而仍然只编程到接口?

更新

根据我从mookid和James Gregory的两个答案之后的理解,我可能走错了路 - 我不应该有理由让每个实体拥有一个接口,就像我现在一样.这一切都很好.我想我的问题就变成了 - 是否没有理由对任何实体的接口进行100%编程?如果甚至有一种情况可以证明这是合理的,那么可以用(流利的)NHibernate做到这一点吗?

我问,因为我不知道,不要批评.谢谢你的回复.:)

c# nhibernate nhibernate-mapping fluent-nhibernate

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

使用LINQ获取序列的奇数/偶数部分

假设我有一个所有的列表Projects,并且我将它们分组为Category:

var projectsByCat = from p in Projects
                    group p by p.Category into g
                    orderby g.Count() descending
                    select new { Category = g.Key, Projects = g };
Run Code Online (Sandbox Code Playgroud)

现在我想将其显示为网页中的列表,首先我创建左侧div,其次是右侧div.我按Projects每个号码排序Category以显示Categories最多的Projects- 因此我想分成projectsByCat两部分 - 如果我把所有"奇数编号" Categories放在左边而"偶数编号"类别放在右边,我我想我会得到一个相当理智的观点.

所以我认为我可以做到这一点,以获得奇数和偶数成员projectsByCat:

var oddCategories = projectsByCat.Where((cat, index) => index % 2 != 0);

var evenCategories = projectsByCat.Where((cat, index) => index % 2 == 0);
Run Code Online (Sandbox Code Playgroud)

它编译 - 然而,当我运行它时,我得到一个例外,如下所示:

用于查询运算符'Where'的不支持的重载.

我认为自从它首先编译后我就安全了.;)

有一种优雅的方式来做到这一点?而且,是否有一个优雅的解释为什么我的创造性使用Where()不起作用? …

c# linq

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

WPF UserControl的服务器端呈现

我正在C#/ .Net 4.5中编写一个服务器端控制台应用程序,它可以获取一些数据并创建保存以供Web服务器显示的静态图表图像.

我主要使用这里描述的方法:http: //lordzoltan.blogspot.com/2010/09/using-wpf-to-render-bitmaps.html

但是,我添加了一个mainContainer.UpdateLayout(); 在Arrange()之后,数据绑定会更新并在渲染图像中可见,以及在它之前的一个Measure()......啊,我不会去那里.

以下是执行渲染的方法:

void RenderAndSave(UIElement target, string filename, int width, int height)
{
    var mainContainer = new Grid
    {
        HorizontalAlignment = HorizontalAlignment.Stretch,
        VerticalAlignment = VerticalAlignment.Stretch
    };

    mainContainer.Children.Add(target);

    mainContainer.Measure(new Size(width, height));
    mainContainer.Arrange(new Rect(0, 0, width, height));
    mainContainer.UpdateLayout();

    var encoder = new PngBitmapEncoder();
    var render = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);

    render.Render(mainContainer);
    encoder.Frames.Add(BitmapFrame.Create(render));
    using (var s = File.Open(filename, FileMode.Create))
    {
        encoder.Save(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

该方法的目标参数将是我所做的WPF/XAML UserControl的一个实例 - 此时相当简单,只是一个网格,其中一些文本数据绑定到我分配给DataContext的ViewModel对象.

对于OxyPlot Plot对象,磁盘上保存的图像看起来很好 - 它完全是白色的.

现在,当我在Visual Studio 2013中担任设计师时,我可以看到它.我添加了一个设计时DataContext,它与我在运行时使用的对象相同(这是我正在做的一个尖峰 …

c# wpf xaml console-application oxyplot

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

以编程方式构建LINQ查询而没有局部变量欺骗我

假设我的对象处于完美的工作状态(即TDD让我觉得它们有效).

我有一个我这样创建的列表(正确缩进除外):

var result = from v in vendors
             from p in v.Products
             orderby p.Name
             select p;
Run Code Online (Sandbox Code Playgroud)

这有效 - 我从所有供应商处获得所有产品.

现在我有一个条件列表,由用户在运行时构建.让我们应用它们:

foreach (Attribute a in requiredAttributes)
{
    result = result.Where(p => p.Attributes.Contains(a));
}
Run Code Online (Sandbox Code Playgroud)

这可能是原始的,但我认为它有用.但是,在完成此foreach循环之后,当您枚举"result"时,它将包含其Attributes属性(也是集合)中具有requiredAttributes集合的LAST属性的所有产品.

对我来说,这种气味就像"a"被覆盖在某个地方,每次旅行通过循环,只有最后一个适用.

如果没有以某种方式将扩展方法写入IEnumerable,称为ContainsAll(IEnumerable)或其他类似的东西,我怎么能实现我想要的,这基本上是一个逻辑AND,只给我那些具有所有必需属性的产品?

c# linq

12
推荐指数
3
解决办法
5250
查看次数

如何让Ninject 2为LINQ to SQL DataContext使用无参数构造函数?

我已经开始使用Ninject 2(昨天从Github下载,包括MVC扩展项目)和一个基于以下技术的项目:

  • .Net 3.5 Sp1
  • ASP.NET MVC 1.0
  • LINQ to SQL

这里没有什么神奇之处 - 我有一些存储库接口(命名为IEntityRepository),这些接口是在运行时代码中使用LINQ to SQL实现的(并在单元测试代码中使用哈希表).这些存储库中的每一个都需要一个从LINQ到SQL的DataContext实例才能与数据库通信,因此这是具体存储库类的构造函数参数.绑定设置如下:

Kernel.Bind<MyDataContext>().ToSelf().InRequestScope();
Run Code Online (Sandbox Code Playgroud)

这样做的原因是我希望能够在不同的存储库之间共享实体,如果我碰巧需要更多它们,并且使用LINQ to SQL datacontext工作原理单元,我觉得创建一个HttpRequest的.

我通常使用MyDataContext的无参数构造函数 - 我不认为这是一种风险,因为它用于测试系统上的内部项目,因此datacontext中的"内置"连接字符串是无害的.但是,由于Ninject 2是"贪婪的"并且想要带有MOST参数的构造函数,并且我无法[Inject]以任何有意义的方式将参数粘贴到生成的代码中,每当Ninject尝试创建我的一个控制器时(我需要一个存储库,需要datacontext).

我已经看到了提及IConstructorScorer能够使用带有LEAST参数的构造函数的"反转"的能力,但是再一次,这将改变注入对其他一切的工作方式 - 默认行为可能是我想要的一切但是datacontext.

那么 - 有一个很好的,干净的方式来指定这个绑定(并且只有这个绑定)应该使用特定的构造函数吗?我们可以和Ninject 1中的提供商做同样的事情,也许可以提供我们自己的"工厂"吗?或者我应该放弃并尝试将参数提供给有意义的datacontext?

c# asp.net-mvc ninject linq-to-sql

11
推荐指数
2
解决办法
1640
查看次数