小编NZJ*_*mes的帖子

C#通用列表中的数组协方差

我有一个例子,我想要一个抽象类接口来返回这样的东西

abstract class AnimalProcessor {
    public abstract IList<Animal> ProcessResults();
}
Run Code Online (Sandbox Code Playgroud)

然后是具体的例子

class GiraffeProcessor : AnimalProcessor {
    public override IList<Animal> ProcessResults() {
        return new List<Giraffe>();
    }
}

class LionProcessor : AnimalProcessor {
    public override IList<Animal> ProcessResults() {
        return new List<Lion>();
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,具体的类必须具有相同的签名重写ProcessResults()方法,以便他们需要返回IList<Animal>,但是实际数据我想返回是一个IList<Lion>,IList<Giraffe>等等,但随后调用代码必须做

GiraffeProcessor processor = new GiraffeProcessor();
IList<Animal> results = processor.GetResults();
Run Code Online (Sandbox Code Playgroud)

哪个不给我一个我想要的Ilist.

问题

1)上面的代码没有编译.giraffeProcessor必须返回一个具体的List<Animal>,你可以用Giraffe对象填充它,但你要构造的对象类型必须返回List<Animal>.不理想.

2)当你返回结果时,你只能得到一个IList<Animal>,而不是IList<Giraffe>.我已经尝试显式地转换IList<Giraffe>IList<Giraffe> results = (IList<Giraffe>) processor.GetResults(); …

c# generics ilist covariance abstract

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

如何使 ViewPager 方形大小为屏幕宽度?

我有一个viewpager,我想占据手机屏幕的整个宽度,不管是多少。我希望 ViewPager 的高度与宽度相匹配,这样整个东西都是方形的,但无法弄清楚如何做到这一点。

我尝试过重量、固定高度、match_parent、wrap_content 的组合,但似乎没有任何东西可以实现这一点

android android-viewpager

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

在毕加索缩放图像大小

我想从URL下载图像并将其显示在我的片段中的视图中.我正在使用毕加索这样做,但我希望图像以原始宽高比显示,但缩放到合理的尺寸 - 即屏幕宽度的75%.我想支持横向和人像照片.所以思考是这样的.

如果屏幕宽度为200且图像为横向5x4宽高比,则图像应显示为75%宽度 - 即150和120高度(保持比例)

如果屏幕宽度为200且图像为纵向4x5宽高比,则图像应显示为75%的屏幕宽度作为高度尺寸 - 即150高度和120宽度

我怎么能用毕加索做到这一点?

android picasso

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

在LINQ中连接父和子集合以获得单个合并输出

我有一个项目集合,每个项目都包含一个辅助集合.我需要根据次要项目的总集生成新项目列表.例如,如果你有一个狗的列表,每只狗有一个朋友列表,我需要所有狗的所有狗朋友的总清单.

通常我会使用SelectMany执行此操作,但这里的难点是我的辅助对象不包含对父对象的引用,并且新列表需要包含来自辅助对象和父对象的字段.即如下

var dogs = List<Dog>
var newList = dogs.SelectMany(i => i.DogFriends).Select(dogFriend => new NewObject
            {
                fieldOne = dog.propertyOne,
                fieldTwo = dog.propertyTwo
                fieldThree = dogFriend.propertyOne
            });
Run Code Online (Sandbox Code Playgroud)

在上面,我没有提到狗,所以我不能选择那些.

我正在寻找的是一种在SQL中连接两个表的方法,因此您可以从两个对象中选择值.但我希望总值与子对象的总数相匹配.即如果你有3只狗,每只3个朋友,最终列表将有9个对象.

如何使用LINQ实现这一目标?

c# linq

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

WPF MVVM可观察集合不更新GUI

我设计了一个MVVM WPF应用程序,并且拥有一个ViewModel,它具有一个名为SelectedCustomer的属性,类型为Customer.该对象有一个名为SummaryDetails的属性,类型为ObservableCollection,它逐行呈现为ListView.

为此,我在ViewModel上创建了一个名为CustomerSummaryDetails的独立属性,它只包含一个get,它返回我上面提到的客户中包含的集合.

在XAML中,我将ItemsSource绑定到CustomerSummaryDetails属性.

这样我就不必绑定到SelectedCustomer.SummaryDetails,这不是那么干净.

SelectedCustomer属性具有get和set方法,set为OTHER属性CustomerSummaryDetails调用OnPropertyChanged,让XAML知道底层集合已更改并更新.

问题是,当我更新集合中的项目时,尽管调用了所有正确的事件,但它并没有反映在GUI上.我已经介入并调用了SelectedCustomer的set方法,然后我按照OnPropertyChanged("CustomerSummaryDetails")调用进入CustomerSummaryDetails属性的"get"方法,如预期的那样.我已经深入研究了返回集合的值,并且列表中的值是更新后的值,但是没有任何内容反映在GUI上,所以我很困惑,因为看起来GUI正在调用get方法来更新它在OnPropertyChanged()调用上,但它没有在视觉上反映.

更新 - 包含的代码

很抱歉不包括代码,我认为只是描述会更容易,但这里是主要的ViewModel属性

public CustomerSummaryViewModel SelectedCustomer
{
    get { return _selectedCustomer; }
    set
    {
        _selectedCustomer = value;
        OnPropertyChanged("CustomerSummaryDetails");
    }
}

public ObservableCollection<RbcUICustomerSummary> CustomerSummaryDetails
{
    get { return _selectedCustomer.SummaryDetails; }
}

public ItemSummaryViewModel SelectedItem
{
    get { return _selectedItem; }
    set
    {
        _selectedItem = value;
        OnPropertyChanged("SelectedItem");
    }
}
Run Code Online (Sandbox Code Playgroud)

XAML如下

    <ListView x:Name="lvCustomerSummary" Margin="10,10,10,10" Background="#F4F8FB" ItemsSource="{Binding CustomerSummaryDetails}" MouseDoubleClick="lvCustomerSummary_MouseDoubleClick" ItemContainerStyle="{StaticResource myHeaderStyleColor}" VirtualizingStackPanel.IsVirtualizing="False" VirtualizingStackPanel.VirtualizationMode="Recycling">
            <ListView.View>
            <GridView ColumnHeaderContainerStyle="{StaticResource myHeaderStyle}">
                    <GridView.Columns>
                    <GridViewColumn Header=""  >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate >
                                <Grid>
                                    <Image …
Run Code Online (Sandbox Code Playgroud)

c# wpf observablecollection mvvm

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

调整大小时WPF工具栏消失

在我的主窗体上,我有一个带有许多按钮的工具栏.通过拖动它来调整父窗体的大小,使整个工具栏及其所有按钮不再适合窗口的宽度,整个工具栏将消失.

有没有一种方法可以使它在调整大小时,当你到达工具栏的宽度时,窗体的内部控件停止调整大小并保持显示,只是切断窗口调整大小的位置?

代码是

<Grid >
<Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
    <ToolBar Grid.Row="1" Height="50" Name="tbMainToolbar" VerticalAlignment="Top" MinWidth="900" >
    <ToolBar.Background>
        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
            <GradientStop Color="White" Offset="0.0" />
            <GradientStop Color="#DCEBFF" Offset="0.25" />
            <GradientStop Color="#99CCFF" Offset="0.75" />
            <GradientStop Color="#99CCFF" Offset="1.0" />
            </LinearGradientBrush>
    </ToolBar.Background>
    <DockPanel LastChildFill="True">
        <Button Name="btnApproved" DockPanel.Dock="Left" Click="btnToolbar_Click" CommandParameter="APPROVED"
                Style="{StaticResource ToolbarButtonDisplay}" HelperClasses:ButtonProperties.Image="..\..\Resources\Images\APPROVEU.GIF" Content="Approve">
        </Button>
        ... and so forth for about 20 buttons
Run Code Online (Sandbox Code Playgroud)

c# wpf toolbar

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

Mongo聚合,投影数组中第一个元素的子字段

我有一个元素子集合,我想在这个集合中投影FIRST项目的某个子字段。我有以下内容,但它仅投影数组中所有元素的字段。

Items是Orders的子集合,每个Item对象都有一个Details子对象和一个在其下的ItemName。我只想返回列表中FIRST项目的项目名称。这将返回列表中每个项目的项目名称。

我该如何调整?

db.getCollection('Orders').aggregate
([
{ $match : { "Instructions.1" : { $exists : true }}},
{ $project: { 
    _id:0, 
    'UserId': '$User.EntityId', 
    'ItemName': '$Items.Details.ItemName'
   }
}
]);
Run Code Online (Sandbox Code Playgroud)

更新:

{
    "_id" : "order-666156",
    "State" : "ValidationFailed",
    "LastUpdated" : {
        "DateTime" : ISODate("2017-09-26T08:54:16.241Z"),
        "Ticks" : NumberLong(636420128562417375)
    },
    "SourceOrderId" : "666156",
    "User" : {
        "EntityId" : NumberLong(34450),
        "Name" : "Bill Baker",
        "Country" : "United States",
        "Region" : "North America",
        "CountryISOCode" : "US",
    },
    "Region" : null,
    "Currency" : null,
    "Items" : [ 
        { …
Run Code Online (Sandbox Code Playgroud)

mongodb

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

ClickOnce的过程和先决条件

我有一个要通过ClickOnce构建和部署的应用程序。但是我们希望这是一个可以在VS之外通过脚本运行的过程,用于测试,业务UAT或生产环境。

每个单独的环境都需要使用不同的.config文件,并在其上以及更新位置上部署不同的Web服务器。

该应用程序还具有.NET运行时3.5和Crystal报表的先决条件。

我已经研究过使用MAGE创建应用程序和部署清单,如果我执行代码构建,然后在每种环境下使用MAGE,以及在正确的.config文件上复制脚本,这将创建我认为的运行脚本时针对每个环境的正确清单。

但是我正在努力做的是包括先决条件。如果通过VS完成,则可以指定setup.exe程序包,该程序包将随pre-reqs一起构建并与应用程序一起部署,当您单击下载链接时,它将先从setup.exe安装该pre-reqs,然后再安装该应用程序。

但是,如何在VS之外手动执行此操作?我可以通过VS在正确的URl位置上构建setup.exe,但是随后如何使用MAGE生成清单作为先决条件将setup.exe链接到应用程序?

我们遇到的问题是:1)用户没有下载和安装软件包的管理员权限,只能通过clickonce进行安装,因此必须在“单击一次”安全性保护下安装先决条件。

谢谢

c# clickonce publishing manifest

2
推荐指数
1
解决办法
3669
查看次数

使用WPF/MVVM在运行时动态更改UserControl内容

我试图创建的屏幕是一个多部分结果查看器.批处理作业完成后,您可以双击它并打开此屏幕,其中包含有关刚刚运行的批处理作业(屏幕的前30%,全宽)的基本数据的顶部,然后是较低的70%将包含左对齐列表框(宽度的20%)和一系列子结果,细节窗格占用剩余的80%宽度.

我希望它表现的方式是当您在左侧列表框中选择"子结果"时,右侧窗格将填充子结果的详细信息.因为它很复杂并且需要可扩展,所以我想将每个子结果细节显示面板实现为UserControl.

父ViewModel包含IDictionary<Enum.ResultType, IResultPanel>- 并且将从该字典的键中填充列表框,当您选择一个选项时,它将从字典中获取IResultPanel对象,该对象将是User Control,下面是一个示例片段

public partial class SimpleCalcInfoResult : UserControl, IResultPanel
    {
        private SimpleCalcInfoResultViewModel _viewModel;

        public SimpleCalcInfoResult(SimpleCalcInfoResultViewModel viewModel)
        {
            InitializeComponent();
            _viewModel = viewModel;
        }
    }
Run Code Online (Sandbox Code Playgroud)

IResultPanel接口是一个空白的空接口,仅用于促进上面的Dictionary具有常见类型,因为我觉得UserControls字典过于宽泛.

我遇到的问题是我无法弄清楚在父控件中使用什么XAML来拥有一个可更改的UserControl面板.显然你可以拥有

<local:MyControl> ... </local:MyControl>
Run Code Online (Sandbox Code Playgroud)

作为一个硬编码的用户控件,但是如何让一部分XAML让我更改显示的用户控件,具体取决于您选择的ListBox项?

c# wpf user-controls

2
推荐指数
1
解决办法
9340
查看次数

Saga 观察者不接收或处理分派的动作

我有一个观察者传奇,它不断地监听某种类型的动作。这是从 saga.run() 启动的。当它接收到某种类型的动作时,它应该调用另一个执行异步动作的 saga。然而,第二个传奇中的断点永远不会被调用。

因此,要么是原始代码没有正确分派动作,要么是 watcher saga 配置错误。

守望者传奇代码

import { all, fork, takeLatest } from 'redux-saga/effects'
import {fetchItems} from './itemsSaga';

function* watchLoadItemsRequest() {
  while(true) {
    yield takeLatest('FETCH_ITEMS_REQUEST', fetchItems);
  }
}    

export default function* root() {
  yield all ([
    fork(watchLoadItemsRequest)
  ])
}
Run Code Online (Sandbox Code Playgroud)

我的 itemsSaga(没有被调用)

import { call, put } from 'redux-saga/effects'
import fetchItemsCompleted from '../actions/fetchItemsCompleted';
import httpCallCompleted from '../actions/httpCallCompleted';
import httpCallStarted from '../actions/httpCallStarted';
import itemAPI from '../api/itemAPI';
import ItemsEntity from '../api/itemEntity';

// worker Saga: will be fired on FETCH_ITEMS_REQUEST actions …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs redux redux-saga

2
推荐指数
1
解决办法
2121
查看次数