在WPF中,我有一个包含7个不同组框的scrollviewer.每个groupbox都是不同表单的独立部分.因为滚动查看器太长了,所以我在面板左侧的堆栈面板中放置了一系列按钮,并完成了代码隐藏,因此单击按钮会触发相应组框的BringIntoView方法.
我的问题是,有没有办法强制BringIntoView每次都将组框定位在可见部分的顶部.默认情况下,BringIntoView仅移动滚动查看器,直到整个组框都在视图中,而不是显示最顶层的项目.有没有解决的办法?
我研究了使用ScrollToVerticalOffset,但无法弄清楚如何获得正确的位置,主要是因为它说groupbox没有Locate属性,我将用它来获取位置,然后用ScrollToVerticalOffset设置它.我在打字时想到的一件事就是让每个按钮 - 首先将jusmp压到顶部的groupbox,然后立即继续正确的一个,但这似乎是一种黑客攻击,我更喜欢找到正确的方法.:)
因此,我遵循以下站点上的指南来限制文本框可以接受的字符。
http://www.rhyous.com/2010/06/18/how-to-limit-or-prevent-characters-in-a-textbox-in-csharp/
我的问题是我不知道如何在辅助类中使事件处理程序触发。基本上,我如何告诉VS在该类而不是MainWindow中查找事件处理程序代码?我尝试搜索,但显然不知道要使用的正确术语。我使用的xaml参考是
xmlns:DigitBox="clr-namespace:System.Windows.Controls;assembly=PresentationFramework"
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一个UserControl名字AddressTemplate,其中包含StackPanel各种各样的Labels&Textboxes.我需要的是一种方法来找到其中一个控件的直接祖先/父级AddressTemplate.从本质上讲,我需要一种方法来确定给定Textbox是否在其中AddressTemplate,或者在此之外UserControl,并且只是一个独立的控件.
到目前为止我想出的是:
private bool FindParent(Control target)
{
Control currentParent = new Control();
if (currentParent.GetType() == typeof(Window))
{
}
else if (currentParent.GetType() != typeof(AddressTemplate) && currentParent.GetType() != null)
{
currentParent = (Control)target.Parent;
}
else
{
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
问题是,我不断收到InvalidCastException,因为它无法将StackPanel转换为Control.有人知道正确的演员阵容,还是一个可行的方法来解决这个问题?
前几天我试着问这个问题,并且承认没有好好说出问题或者首先发布代码,答案已经结束了.所以我在这里再试一次,因为老实说这让我很快就疯了.:)
我正在尝试实现这个Address Parser,它最初是一个基于控制台的c#程序.我已成功将其转换为独立的WPF程序,该程序仅包含TextBoxfor输入,a Button用于激活解析,以及TextBlock用于显示结果.在写这篇文章时,我确实将输出截断为我在主程序中需要的内容,但它仍能正常工作.我在下面列出了整个代码.
我的下一步是把它移植到我的主程序中,我通过字面意思使用复制/粘贴.然而,在运行此按钮后,程序会在按下按钮后挂起.最终VS给出了一个错误,即进程已经过长而没有抽出消息,并且TaskManager中的内存使用量从~70k逐渐增加到3,000,000.为此,我将该Parsing方法分配给后台工作者,希望减轻主进程的工作量.这确实解决了程序冻结,但后台线程只是做了同样的事情,提高了RAM使用率并且什么也没有返回.
所以现在我陷入了僵局.我知道问题出现在var result = parser.ParseAddress(input);语句中的某个地方,因为当为每行代码使用断点时,这是最后一个要触发的行.但基本上我不知道为什么这会导致一个WPF程序出现问题,而不是另一个.
如果有必要,我会非常乐意在某个地方发布主程序的完整源代码,但我无法想象在这里发布大约20个不同的类文件和项目代码是个好主意.:)
独立的WPF应用程序
namespace AddressParseWPF
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public void Execute()
{
AddressParser.AddressParser parser = new AddressParser.AddressParser();
var input = inputTextBox.Text;
var result = parser.ParseAddress(input);
if (result == null)
{
outputTextBlock.Text = "ERROR. Input could not be parsed.";
}
else
{
outputTextBlock.Text …Run Code Online (Sandbox Code Playgroud) 我目前正在努力将一些VB源代码转换为C#.虽然我知道有一些转换器可以实现自动化,并且我可以实际使用这个特殊的dll而无需重写它,我正在部分地这样做,所以我可以更好地理解VB.并不是期望写它,但它至少帮助我能够阅读它.
在这样做的过程中,我遇到了令人困惑的事情.以下代码片段是示例,但我在整个程序中都看到了它.
VB源代码:
Friend Function AllocateObjectNumber() As Long
AllocateObjectNumber = _nextFreeObjectNumber
_nextFreeObjectNumber += 1
_objectAllocatedCount += 1
End Function
Run Code Online (Sandbox Code Playgroud)
我的翻译C#代码:
internal long AllocateObjectNumber()
{
cvNextFreeObjectNumber += 1;
cvObjectAllocatedCount += 1;
return cvNextFreeObjectNumber;
}
Run Code Online (Sandbox Code Playgroud)
我不理解的是VB使用的流控制.我理解这AllocateObjectNumber += 1是用来代替的return cvNextFreeObjectNumber,但如果这一行在两个变量递增之前出现,那么该代码怎么不被视为无法访问?根据我对C#的理解,这个方法的第一行会立即返回到调用方法,整个方法基本上就是伪属性.
任何有用的解释?
在阅读Java教程书时,我遇到了这段代码:
while(getImage().getWidth(frame) <= 0);
我起初认为这是一个错字,但在整本书中,它在多个地方重复了几次.很遗憾没有解释它的作用,所以我想知道它的目的是什么.从表面上来看,我知道它基本上什么都不做,因为即使它可以返回,true或者false,while语句也没有.这是一个特殊的语法案例吗?事实上,它做了什么?或者这只是毫无意义的代码,恰好不会对代码流产生负面影响(它不会返回任何错误,并且所有内容都按预期运行).
以下是完整的方法,如果它有帮助:
public void load(String filename)
{
Toolkit tk = Toolkit.getDefaultToolkit();
image = tk.getImage(getURL(filename));
while(getImage().getWidth(frame) <= 0);
double x = frame.getSize().width / 2 - width() / 2;
double y = frame.getSize().height / 2 - height() / 2;
at = AffineTransform.getTranslateInstance(x, y);
}
Run Code Online (Sandbox Code Playgroud) c# ×5
wpf ×4
.net ×1
alignment ×1
casting ×1
java ×1
parent-child ×1
parsing ×1
regex ×1
return ×1
scrollview ×1
vb.net ×1
while-loop ×1