我正在阅读async/await,什么时候Task.Yield可能有用,并且发现了这篇文章. 我从那篇文章中得到了关于下面的问题:
使用async/await时,无法保证在执行await时调用的方法
FooAsync()实际上是异步运行的.内部实现可以使用完全同步的路径自由返回.
这对我来说有点不清楚,可能是因为我头脑中的异步定义没有排成一行.
在我看来,由于我主要做UI开发,异步代码是不在UI线程上运行的代码,而是在其他一些线程上.我想在我引用的文本中,如果一个方法阻塞在任何线程上(即使它是一个线程池线程),它也不是真正的异步.
题:
如果我有一个长时间运行的任务是CPU绑定的(假设它做了很多硬数学运算),那么异步运行该任务必须阻塞一些线程吗?有些东西实际上要做数学.如果我等待它,那么一些线程就会被阻止.
什么是真正的异步方法的例子,它们将如何实际工作?这些是否仅限于利用某些硬件功能的I/O操作,因此没有阻止任何线程?
我有一个用户控件,称之为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和*大小调整是否有任何限制/问题?这似乎是保持列宽度同步的最佳方法,但我似乎无法解决这个问题.
谢谢.
我有一个简单的WrapPanel包含许多宽控件.当我调整大小Width时,Window一切按预期工作.如果有足够的空间,控件将在一行上进行,或者如果没有,则控件将在下一行中包含.
但是,我需要发生的是,如果所有控件基本上都是垂直堆叠的(因为没有更多的水平空间)并且其中Width的Window更多还是更多,则会出现一个水平滚动条,以便我可以滚动并查看整个控制我是否愿意.下面是我的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) 我试图修改我的简单控件,以便文本框不会随着用户键入长文本而增长.我看了一下在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) 我经常听到/阅读基于接口的编程,但我并不清楚这究竟意味着什么.基于接口的编程是一个真正独立的主题,实际上有关于它的书籍吗?如果是这样,有人可以推荐任何好的吗?
我遇到了基于接口的编程,因为我正在阅读有关如何设计好API并希望了解它的更多信息.现在我不清楚如何正确地设计围绕接口的API.
任何信息都非常感谢.
我为网格定义了大量样式(基于状态的单元格颜色等).现在我使用DataTriggers设置适当的颜色.我希望改善我的应用程序的性能,并认为大量的样式可能导致速度减慢(由于数据不断变化和需要重新计算/刷新的样式).使用转换器而不是DataTriggers进行数据绑定是否更好?
如果可以使用任何一种方法实现目标,那么是否有任何性能差异?我不熟悉幕后发生的事情所以我不能确定.
我需要显示一个带有当前时区缩写的标签.我的电脑的时区目前设定为"(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?
我有以下代码隐藏:
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.
假设我有一个类定义如下的类:
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应用程序中,我有一个XamDataGrid.网格绑定到ObservableCollection.我需要允许用户通过网格插入新行,但事实证明,为了使"添加新行"行可用,xamDataGrid的源需要实现IBindingList.ObservableCollection不实现该接口.
如果我将我的源代码更改为BindingList,它可以正常工作.但是,根据我在阅读这个主题时可以理解的,BindingList实际上是一个WinForms的东西,在WPF中并不完全支持.
如果我将所有ObservableCollections更改为BindingLists,我会犯错吗?有没有人有任何其他建议,我如何为我的xamDataGrid添加新的行功能,同时将源保持为ObservableCollection?我的理解是,有许多不同的网格需要实现IBindingList才能支持添加新的行功能,但我看到的大多数解决方案只是切换到BindingList.
谢谢.
wpf ×7
c# ×5
.net ×3
wpf-controls ×3
data-binding ×2
xaml ×2
asynchronous ×1
binding ×1
grid ×1
infragistics ×1
interface ×1
layout ×1
scroll ×1
timezone ×1
triggers ×1
wrappanel ×1