小编Fla*_*ack的帖子

关于线程的混淆以及异步方法在C#中是否真正异步

我正在阅读async/await,什么时候Task.Yield可能有用,并且发现了这篇文章. 我从那篇文章中得到了关于下面的问题:

使用async/await时,无法保证在执行await时调用的方法FooAsync()实际上是异步运行的.内部实现可以使用完全同步的路径自由返回.

这对我来说有点不清楚,可能是因为我头脑中的异步定义没有排成一行.

在我看来,由于我主要做UI开发,异步代码是不在UI线程上运行的代码,而是在其他一些线程上.我想在我引用的文本中,如果一个方法阻塞在任何线程上(即使它是一个线程池线程),它也不是真正的异步.

题:

如果我有一个长时间运行的任务是CPU绑定的(假设它做了很多硬数学运算),那么异步运行该任务必须阻塞一些线程吗?有些东西实际上要做数学.如果我等待它,那么一些线程就会被阻止.

什么是真正的异步方法的例子,它们将如何实际工作?这些是否仅限于利用某些硬件功能的I/O操作,因此没有阻止任何线程?

.net c# asynchronous

48
推荐指数
5
解决办法
5516
查看次数

Grid的SharedSizeGroup和*大小调整

我有一个用户控件,称之为UserControl,它有一个包含以下列定义的网格:

<Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
            <ColumnDefinition Width="Auto" SharedSizeGroup="B"/>
            <ColumnDefinition Width="*" SharedSizeGroup="C"/>
            <ColumnDefinition Width="Auto" SharedSizeGroup="D"/>
            <ColumnDefinition MinWidth="30" Width="*" SharedSizeGroup="E"/>
            <ColumnDefinition MinWidth="30" Width="*" SharedSizeGroup="F"/>
            <ColumnDefinition Width="110" SharedSizeGroup="G"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="H"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="I"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="J"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="K"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="L"/>
</Grid.ColumnDefinitions>
Run Code Online (Sandbox Code Playgroud)

我还有MainWindow,它包含一个网格本身,在网格上定义了以下属性:

Grid.IsSharedSizeScope="True"
Run Code Online (Sandbox Code Playgroud)

现在,我在MainWindow的网格中添加了几个UserControl(每个都是一个单独的行).我的目标是让不同UserControls的每个列宽保持同步.除了一件事,使用SharedSizeGroup时一切正常.似乎任何宽度为*的列都不会表现得如此.看起来*列宽度设置为好像它们是Auto.

SharedSizeGroup和*大小调整是否有任何限制/问题?这似乎是保持列宽度同步的最佳方法,但我似乎无法解决这个问题.

谢谢.

wpf grid layout xaml wpf-controls

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

WPF包装面板和滚动

我有一个简单的WrapPanel包含许多宽控件.当我调整大小Width时,Window一切按预期工作.如果有足够的空间,控件将在一行上进行,或者如果没有,则控件将在下一行中包含.

但是,我需要发生的是,如果所有控件基本上都是垂直堆叠的(因为没有更多的水平空间)并且其中WidthWindow更多还是更多,则会出现一个水平滚动条,以便我可以滚动并查看整个控制我是否愿意.下面是我的xaml.我试着把它包裹起来WrapPanel,ScrollViewer但我无法实现我的目标.

<Window x:Class="WpfQuotes.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="Auto" Width="600" Foreground="White">
    <WrapPanel>
      <Button Width="250">1</Button>
      <Button Width="250">2</Button>
      <Button Width="250">3</Button>
    </WrapPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)

因此,如果Width将上述内容减少Window到最小值,您将无法看到按钮的文本.我想要一个水平滚动条出现,以便我可以滚动查看文本,但不会干扰通常的包装功能.

谢谢.

更新: 我已按照下面的保罗建议,水平滚动条现在按预期显示.但是,我也希望垂直滚动可用,所以我设置VerticalScrollBarVisibility="Auto".问题是,如果我调整窗口大小以便显示垂直滚动条,即使不需要(也有足够的水平空间来查看整个控件),也会始终显示水平滚动条.好像出现的垂直滚动条会弄乱滚动查看器的宽度.有没有办法纠正这个问题,除非实际需要水平滚动条,否则不会出现?

下面是我的xaml和我添加的唯一代码CustomWrapPanel:

<Window x:Class="Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cwp="clr-namespace:CustomWrapPanelExample"
        Title="Window1" Height="Auto" Width="300" Foreground="White" Name="mainPanel">
  <ScrollViewer x:Name="MyScrollViewer" HorizontalScrollBarVisibility="Auto"
                VerticalScrollBarVisibility="Auto">
    <cwp:CustomWrapPanel Width="{Binding ElementName=MyScrollViewer, Path=ActualWidth}">
      <Button Width="250">1</Button>
      <Button Width="250">2</Button>
      <Button Width="250">3</Button>
      <Button Width="250">4</Button>
      <Button Width="250">5</Button>
      <Button Width="250">6</Button>
      <Button Width="250">7</Button>
      <Button Width="250">8</Button> …
Run Code Online (Sandbox Code Playgroud)

c# wpf scroll wrappanel

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

阻止WPF TextBox随着文本的增长而停止

我试图修改我的简单控件,以便文本框不会随着用户键入长文本而增长.我看了一下在Stackoverflow上发布的一些解决方案,建议使用Grid和一个不可见的Border并将文本框的宽度绑定到Border的ActualWidth,但我似乎无法在我的设置中使用它.

这是我控制的xaml:

<StackPanel Margin="5,0">
<WrapPanel Margin="0,0,0,5">
  <TextBlock Foreground="White" Margin="0,0,2,0">TEXT</TextBlock>
  <TextBlock Foreground="#FF0099CC" FontWeight="Bold">MORE TEXT</TextBlock>
</WrapPanel>
<Border Margin="2,4,0,4" BorderThickness="1" SnapsToDevicePixels="True" Background="Black"
        BorderBrush="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}">
  <StackPanel Orientation="Horizontal">
    <Image Source="..\Resources\zoom.png" Width="13"/>
    <TextBox Foreground="White" Background="Black" BorderBrush="Transparent">THIS IS SOME TEXT</TextBox>
  </StackPanel>
</Border>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我需要zoom.png出现在文本框的"内部",所以我使用水平堆栈面板,只是将图像和文本框并排放置,两者都被相同的边框包围.

有没有办法让我在输入文字时停止自动增长的文本框?

谢谢.

更新:

下面是我正在测试的xaml.

<Window x:Class="Desktop.Shell"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:composite="http://www.codeplex.com/CompositeWPF"
    Title="MyShell" Height="50" Width="900"
    WindowStyle="None"
    ShowInTaskbar="False"        
    AllowsTransparency="True"
    Background="Transparent"
    ResizeMode="CanResizeWithGrip"
    WindowStartupLocation="CenterScreen">
  <Border BorderBrush="Black"
                BorderThickness="1.5"
                CornerRadius="5"
                Background="Gray">
    <ItemsControl composite:RegionManager.RegionName="MainRegion">
      <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <WrapPanel></WrapPanel>
        </ItemsPanelTemplate>
      </ItemsControl.ItemsPanel>
    </ItemsControl>
  </Border>
</Window>


<UserControl x:Class="Desktop.SearchTextBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="50" Margin="0">
  <StackPanel Margin="5,0">
    <WrapPanel …
Run Code Online (Sandbox Code Playgroud)

wpf wpf-controls

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

究竟什么是"基于接口的编程"?

我经常听到/阅读基于接口的编程,但我并不清楚这究竟意味着什么.基于接口的编程是一个真正独立的主题,实际上有关于它的书籍吗?如果是这样,有人可以推荐任何好的吗?

我遇到了基于接口的编程,因为我正在阅读有关如何设计好API并希望了解它的更多信息.现在我不清楚如何正确地设计围绕接口的API.

任何信息都非常感谢.

.net c# design-patterns interface

18
推荐指数
3
解决办法
9707
查看次数

DataTrigger vs数据绑定与转换器性能明智

我为网格定义了大量样式(基于状态的单元格颜色等).现在我使用DataTriggers设置适当的颜色.我希望改善我的应用程序的性能,并认为大量的样式可能导致速度减慢(由于数据不断变化和需要重新计算/刷新的样式).使用转换器而不是DataTriggers进行数据绑定是否更好?

如果可以使用任何一种方法实现目标,那么是否有任何性能差异?我不熟悉幕后发生的事情所以我不能确定.

data-binding wpf triggers

18
推荐指数
1
解决办法
4536
查看次数

C#british summer time(BST)timezone的缩写

我需要显示一个带有当前时区缩写的标签.我的电脑的时区目前设定为"(GMT)格林威治标准时间:都柏林,爱丁堡,里斯本,伦敦".因此,我希望看到BST显示,因为LN目前正处于英国夏季.

看起来这个信息(时区缩写)不可用.看看GMT TimeZoneInfo,关于名字我只能看到

Id  "GMT Standard Time"
StandardName    "GMT Standard Time"
DaylightName    "GMT Daylight Time"
Run Code Online (Sandbox Code Playgroud)

有没有办法从"GMT日光时间"或任何其他可用的Windows时区信息到达BST?

.net c# timezone

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

将ObservableCollection绑定到WPF ListBox

我有以下代码隐藏:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        ObservableCollection<int> sampleData = new ObservableCollection<int>();
        public ObservableCollection<int> SampleData
        {
            get
            {
                if (sampleData.Count <= 0)
                {
                    sampleData.Add(1);
                    sampleData.Add(2);
                    sampleData.Add(3);
                    sampleData.Add(4);
                }
                return sampleData;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的xaml是:

<Window x:Class="Sandbox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListBox ItemsSource="{Binding Path=SampleData}"/>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

该列表不显示集合中的值(或任何内容).有人能指出我的错误是什么吗?

我是否需要显式设置DataContext?我想如果没有设置控件将只使用自己作为DataContext.

wpf binding wpf-controls

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

xaml中的常量

假设我有一个类定义如下的类:

namespace MyProject.MyConstants
{
    public class Constants
    {
        public class Group1Constants
        {
            public const string DoIt= "DoIt";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图在我的xaml中使用这个const,来自一个单独的项目.我包含了命名空间:

xmlns:constants="clr-namespace:MyProject.MyConstants;assembly=MyProject.MyConstants"
Run Code Online (Sandbox Code Playgroud)

并尝试使用常量如下:

<MenuItem Header="{x:Static controls:Constants.Group1Constants.DoIt}">
Run Code Online (Sandbox Code Playgroud)

以上不会编译,说

Cannot find the type 'Constants.Group1Constants'. Note that type names are case sensitive.
Run Code Online (Sandbox Code Playgroud)

我一定很遗憾.我想要做的就是在我的xaml中使用不同项目中的类的一些常量.

有什么建议?

wpf xaml

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

WPF ObservableCollection <T> vs BindingList <T>

在我的WPF应用程序中,我有一个XamDataGrid.网格绑定到ObservableCollection.我需要允许用户通过网格插入新行,但事实证明,为了使"添加新行"行可用,xamDataGrid的源需要实现IBindingList.ObservableCollection不实现该接口.

如果我将我的源代码更改为BindingList,它可以正常工作.但是,根据我在阅读这个主题时可以理解的,BindingList实际上是一个WinForms的东西,在WPF中并不完全支持.

如果我将所有ObservableCollections更改为BindingLists,我会犯错吗?有没有人有任何其他建议,我如何为我的xamDataGrid添加新的行功能,同时将源保持为ObservableCollection?我的理解是,有许多不同的网格需要实现IBindingList才能支持添加新的行功能,但我看到的大多数解决方案只是切换到BindingList.

谢谢.

c# data-binding wpf infragistics observablecollection

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