我在设计屏幕中的XAML页面内.不知怎的,我把VS2010变成了一个模式,它将光标改变为十字准线,当你点击时你将UIElement放在你点击的位置. 我无法弄清楚a)我是如何进入这种模式的,以及b)如何离开. 我希望能够单击"设计"视图中的元素并自动导航到与其关联的XAML,并且我无法返回到该模式.
有任何想法吗?
PS-我在Visual Studio Express 2010 for C#中,如果这有任何区别.
好的,所以我在很多地方搜索过这个问题的答案,但如果我错过了一些明显的东西,我会对任何链接持开放态度.
我有兴趣在用户尝试打开特定文件时向用户生成合理的错误消息,但无论出于何种原因,程序都无法访问该文件.我想区分以下情况:
我正在使用FileStream对象.我已经查看了用于实例化FileStream的msdn文档,并且我完全不清楚Exception是否为上述内容做了什么,以及如何区分它们.我承认我在Windows编程方面的经验有限,所以我可能会遗漏一些明显的东西.如果是这样,我道歉.
希望没有其他人已经问过这个问题,但我已经搜索过,找不到任何提及.如果我错过了另一个解释这个问题的问题,请随意指出我正确的方向.
我有一个带有数据绑定项的WrapPanel,它基本上包含一个图标和一些可变长度文本(这是图表的图例).当我将ItemWidth设置为某个设定值时,我真的很喜欢这些项目出现在整齐的列中.但是,由于每个项目中文本长度的高度可变性,我无法轻易选择适用于所有情况的特定值.也就是说,在某些情况下,所有项目的文本可能都很短,因此ItemWidth的值较小是合适的.但有时,如此小的ItemWidth会导致某些项目中的文本被截断.
我想我可以将ItemWidth数据绑定到WrapPanel的子节点,以便提取每个项目的宽度(并找到最大宽度,并将其用作ItemWidth等),但我很谨慎这样做,因为它的潜力数据绑定到错误的东西.就像在,绑定到ItemWidth更改时更改的内容,导致无限循环(或至少循环重复次数超过必要的循环).
设置此项的最佳方法是什么,以便ItemWidth仅为防止截断所需的大小?
编辑:
我想保留WrapPanel提供的功能,允许存在可变数量的项目列,具体取决于WrapPanel本身允许的空间.
好的,所以我有一个带有 CanUserAddRows=false的DataGrid(标准 WPF DataGrid,它随 .Net 4.0 一起提供,而不是 WPF Toolkit DataGrid)。它绑定到 ViewModel 中的 ObservableCollection。它正确设置了 MaxHeight,以便在屏幕行数过多时滚动。
它的工作方式很好,除了如果用户将鼠标放在 DataGrid 上然后向下移动滚轮,那么行下方会出现一些额外的空间:

我宁愿在这种情况下不出现灰色空间(无需滚动)。我该如何实现?
PS由于我们程序的一些特殊要求,我实际上已经为DataGrid底部的新行构建了自己的功能,因此DataGrid底部的空白行。它完全在 VM 中完成,所以它不应该影响这个问题的答案。
这种行为发生在我目前拥有的每个DataGrid 上。然而,当maxHeight设置在DataGrid中,有更多的行相比,可以显示出来,那么内容开始滚动。在这种情况下,线条下方的灰色空间的大小是可变的。也就是说,由于DataGrid基于内容而不是物理滚动滚动(有关差异的详细信息,请参阅此内容,在备注部分下),当您一直滚动到底部。灰色空间填充了额外的空间。下面是一个例子:

澄清一下,我不太介意这种行为,只是当不需要滚动时出现灰色空间。我只是认为这种行为将有助于指出问题的原因。
我发现了可能导致问题的原因:如果将 EnableRowVirtualization 设置为 false,则会出现此问题。 但是,如果我想将其设置为 false,在不需要滚动时如何防止出现灰色空间/“额外行”?(这是我的主要关注点,也是这个问题的重点)
我在WPF应用程序中使用称为Pigiarniq的自定义字体.我发现有时候,单词会从使用此字体的TextBlocks中消失.消失的单词会出现在它们所在行的末尾,或者可能出现在下一行,这让我觉得Text包装出了问题.我终于(经过很多困难)将问题分离到一小段代码(注意:这只是一个确认问题发生的测试.这不是我程序的一部分):
<Window x:Class="Test_the_textbox_width.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="850">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<Grid
HorizontalAlignment="Center">
<TextBlock HorizontalAlignment="Left"
Name="textBlock1"
VerticalAlignment="Top"
FontFamily="Pigiarniq%20Regular.ttf#Pigiarniq"
TextWrapping="Wrap"
FontSize="15"
Margin="10">
<TextBlock.Text>
You do not need to enter both manually. Rates are calculated using true depositional
(uncompacted) thicknesses, rather than measured present-day thicknesses.
</TextBlock.Text>
</TextBlock>
</Grid>
</Grid>
Run Code Online (Sandbox Code Playgroud)
在"(未压缩)"之后出现的"厚度"一词不会出现.如果我使用窗口手柄手动调整窗口大小,它将重新出现.
注意:我已将TextBlock放在上面的Grid元素中,因为有时在TextBlock位于Grid中时会出现此问题.在另一个例子中,它位于InlineUIContainer中.还有其他情况.
我发现如果我明确设置宽度不会发生这种情况,例如我订阅了TextBlock上的Loaded事件:
private void textBlock1_Loaded(object sender, RoutedEventArgs e)
{
textBlock1.Width = textBlock1.ActualWidth;
//textBlock1.Width = Double.NaN; //if you leave this in, you get the bad behaviour
} …Run Code Online (Sandbox Code Playgroud) 我一直在讨论这个问题,并且只找到了部分解决方案.
我正在尝试设置TabControl,以便在某些情况下我可以阻止用户更改当前选定的选项卡.当阻止用户更改当前选定的选项卡时,将显示一个对话框.
我已经阅读了以下文件:
我已经实现了第3个链接中指示的解决方案(尽管以上所有内容都会产生相同的错误).它有效,但 ......
如果用户执行以下操作,事情就会彻底搞乱:
这显然不是理想的行为. 为什么MessageBox不是第二次出现,为什么不应该禁用这个选项卡呢?
如果我删除MessageBox部分,它工作正常.
以下是TabControl.SelectionChanged事件处理程序的代码:
bool _isChanging = false;
private void tabControlForNavigation_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!_isChanging && canChangeTabs.IsChecked.HasValue)
{
_isChanging = true;
bool canLeave = canChangeTabs.IsChecked.Value; //normally this would be replaced by a check in the ViewModel
if (!canLeave)
{
int prevIndex = tabControlForNavigation.Items.IndexOf(tabControlForNavigation.SelectedContent);
tabControlForNavigation.SelectedIndex = prevIndex;
MessageBox.Show("Can't change tabs!"); //if I comment out this line, …Run Code Online (Sandbox Code Playgroud) 精简版:
我有一个List对象,其中包含重复值运行中存在的多个重复值(double),其中散布着更改值的运行.我希望减少此List对象占用的内存空间,而不会损害索引和值之间的关联.我还希望尽可能保持接近O(1)算法的查找时间,使用索引作为查找.例如,如果您有一个包含{0,0.1,0.1,0.1,0.2}元素的列表,那么如果给出索引1,2或3,则新对象/实体将始终返回0.1.我希望我需要创建我自己的对象(可能实现IList),或者使用现有的对象.我知道如何实现这个算法会使算法O(log(m)),其中,m是相同值的运行次数(在我的例子中,只有1次运行).但是,如果可能的话,我宁愿不自己动手.
这样的对象是否存在于C#中,还是我需要自己滚动?
动机/长版:
我有一个桌面应用程序正在做一些重大的科学计算.计算生成大量数据,并根据时间组织数据.也就是说,对于时间50,存在变量x,y和z的值.对于时间51,存在变量x,y和z的另一个值.我有一个List,其中包含运行计算的所有时间.每个变量都有一个List,其索引与时间List的索引相同.也就是说,如果查看时间数组的索引234,则可能会得到时间46(秒).然后,在该变量的List的索引234处找到时间46(秒)处的每个变量的计算.
大约有100,000个这样的变量(因此有100,000个列表),但只有一个时间列表.我还希望增加更多变量.这显然是一个内存问题.(目前至少约200 MB的原始空间:-)).这也应该解释为什么我想使用索引作为在特定时间找到某个变量的值的方法.
对于变量来说,在前x个槽中只有0是相当典型的.或者在索引y之后,变量保持不变直到结束.我想说,值为常量的周期数的最坏情况可能在单个列表中约为30,但通常在2到5之间.每个数组中的总值的数量通常可能约为250.
编辑:
请注意,我希望添加的变量比100,000更多,所以这个问题比200 MB更大.为了解释更多这方面的动机,我的应用程序目前运行在大约1 GB以上,我看到200 MB是减少内存使用率的最低成果.
EDIT2:
我意识到对我的解释进行了非常重要的编辑 - 我已经在上面进行了编辑并在此处进行了解释.列表可能已在其中运行,但它们也具有值从索引到索引更改的部分.所以我可能有一个更好的列表示例如下:
0 0 0 0 0 0 ....(50重复0)... 0.1 0.2 0.4 0.5 0.6 ...(50多个变化值)... 200.45 200.45 200.45 200.55 ...(50多个重复值).. ......等
c# ×6
wpf ×4
mvvm ×2
.net-4.0 ×1
algorithm ×1
custom-font ×1
data-binding ×1
datagrid ×1
filestream ×1
list ×1
optimization ×1
tabcontrol ×1
word-wrap ×1
xaml ×1