我在代码隐藏中创建了一些控件,并希望动态设置它的大小.我可以分配数值System.Windows.GridLength.Auto,但没有相应的"*".
是因为在"*"解析WPF时,来自XAML的内容会被转换为代码吗?
为此提供一些细节:有一个有三行的网格.我希望顶行和底行占用所有空间,而中间行保持自动调整大小.
我在表单上有一系列文本框.当用户在这些文本框中插入数字时,会进行计算并<asp:Label>通过JavaScript更新控件以反映这些计算:
document.getElementById('<%=TotalLoans.ClientID %>').innerHTML = TotalLoans;
Run Code Online (Sandbox Code Playgroud)
这正确地更新了UI.但是,当我尝试访问代码隐藏中的值时,该Text属性为空.这是有道理的,因为我innerHTML通过JavaScript 更新了属性.
//TotalLoans.Text will always be equal to "" in this scenario
double bTotalLoans = string.IsNullOrEmpty(TotalLoans.Text)
? 0.00
: Convert.ToDouble(TotalLoans.Text);
Run Code Online (Sandbox Code Playgroud)
如何更新Text的特性<asp:Label>以这样的方式,我可以阅读代码隐藏属性通过JavaScript?
这是一个包含41个标签的大型表单上的一个小问题,每个标签显示用户的某些计算结果.根据FishBasketGordo的建议,我将我<asp:Label>转变为残疾人<asp:TextBox>.我正在设置新文本框的值:
document.getElementById('<%=TotalLoans.ClientID %>').value = TotalLoans;
Run Code Online (Sandbox Code Playgroud)
同样,在代码隐藏中,值TotalLoans.Text始终等于"".
我不介意改变我的方法,但这是问题的症结所在.
我正在使用JavaScript来操纵某些控件的属性值.当点击"提交"时,我需要能够从后面的代码中访问这些被操纵的值.
我有什么建议可以解决这个问题吗?
关于@James Johnson的回答,我无法.innerText按建议使用属性检索值.我已经EnableViewState设定为真的<asp:Label>.还有其他我想念的东西吗?
我不明白为什么,当我输入文本框并提交表单时,我可以访问代码隐藏中的值,但是当我以编程方式通过JavaScript更改文本框或标签的文本时,我无法访问新值.
我试图尽可能地遵循WPF应用程序中的MVVM模式,主要是为了能够为我的ViewModel逻辑创建单元测试.
在大多数情况下,ViewModel属性和可视元素属性之间的数据绑定工作正常并且很容易.但有时我遇到的情况是,我无法看到明显和直接的方式,而从代码隐藏访问和操作控件的解决方案非常容易.
这是我的意思的一个例子:将文本片段插入TextBox当前插入符号位置
由于CaretIndex它不是依赖项属性,因此无法直接绑定到ViewModel的属性.以下是通过创建依赖项属性来解决此限制的解决方案.而这里是代码隐藏做到这一点的解决方案.在这种情况下,我更喜欢代码隐藏方式.我最近遇到的另一个问题是将动态的列集合绑定到WPF数据网格.在代码隐藏中编程非常简单明了.但对于MVVM友好的数据绑定方法,我只能在几个博客中找到解决方法,这些博客对我来说都很复杂,并且在一个或另一个方面有各种限制.
我不想不惜一切代价保持MVVM架构清除代码隐藏逻辑.如果工作量太大,MVVM友好的解决方案需要大量我不完全理解的代码(我仍然是WPF初学者)并且太耗时我更喜欢代码隐藏解决方案并牺牲我的应用程序的一些部分的自动可测试性.
出于上述实用的原因,我现在正在寻找"模式"来在应用程序中控制使用代码隐藏而不破坏MVVM架构或不破坏它.
到目前为止,我已经找到并测试了两种解决方案.我将使用Caret Position示例绘制粗略的草图:
解决方案1)通过抽象接口为ViewModel提供对View的引用
我将有一个接口与视图实现的方法:
public interface IView
{
void InsertTextAtCaretPosition(string text);
}
public partial class View : UserControl, IView
{
public View()
{
InitializeComponent();
}
// Interface implementation
public void InsertTextAtCaretPosition(string text)
{
MyTextBox.Text = MyTextBox.Text.Insert(MyTextBox.CaretIndex, text);
}
}
Run Code Online (Sandbox Code Playgroud)将此接口注入ViewModel
public class ViewModel : ViewModelBase
{
private readonly IView _view;
public ViewModel(IView view)
{
_view = view;
}
}
Run Code Online (Sandbox Code Playgroud)通过接口方法从ViewModel的命令处理程序执行代码隐藏
public ICommand InsertCommand { get; …Run Code Online (Sandbox Code Playgroud)我需要从后面的代码动态创建一个WPF网格.这样做是可以的,我可以这样做,以便我设置内容宽度,但我需要做的是设置它们,以便当我调整窗口大小时,控件重新调整大小
var col = new ColumnDefinition();
col.Width = new System.Windows.GridLength(200);
grid1.ColumnDefinitions.Add(col);
Run Code Online (Sandbox Code Playgroud)
这将产生XAML
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"></ColumnDefinition>
</Grid.ColumnDefinitions>
Run Code Online (Sandbox Code Playgroud)
但我需要的是使用*或问号,即.
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
Run Code Online (Sandbox Code Playgroud)
但是从后面的代码创建时,WidthValue不支持*或问号a?
ASP.NET代码隐藏中的page_load和onLoad函数有什么区别?
这可能是一个简单的问题,但我一直在环顾四周,找不到答案.是否有任何代码可以从代码中显示Android上下文菜单,而不是按菜单按钮?例如,当我触摸屏幕时,它会调用上下文菜单吗?
我想从代码后面添加HTML结构和控件到面板
<div class='Main'>
<div class='cst'>
First Name
</div>
<div class='csc'>
<asp:Label ID="lblFirstName" CssClass="ronly" runat="server"></asp:Label>
</div>
<div class='cst'>
First Name
</div>
<div class='csc'>
<asp:Label ID="lblFirstName" CssClass="ronly" runat="server"></asp:Label>
</div> <div class='cst'>
First Name
</div>
<div class='csc'>
<asp:Label ID="lblFirstName" CssClass="ronly" runat="server"></asp:Label>
</div>
<div class='end'>
</div>
</div>
<asp:Panel runat="server" CssClass="sxpnl" ID="pnlUserdata">
</asp:Panel>
Run Code Online (Sandbox Code Playgroud)
如果我尝试添加这样的
HtmlGenericControl divcontrol = new HtmlGenericControl();
divcontrol.Attributes["class"] = "sxro sx1co";
divcontrol.TagName = "div";
pnlUserSearch.Controls.Add(divcontrol);
Label question = new Label();
questionDescription.Text = "text";
pnlUserSearch.Controls.Add(question);
Run Code Online (Sandbox Code Playgroud)
它将一个接一个地添加控件,如何使控件像上面所示那样嵌套.
我注意到最新版本的ASP.NET MVC,View不再默认使用代码隐藏类.
如何将现在的代码隐藏类添加到视图或部分视图?
有没有什么办法让HttpContext.Current.Request.Url.Host和HttpContext.Current.Request.ApplicationPath一个电话吗?
像"完整的应用程序URL"?
编辑:澄清 - 我需要的是[]中的部分:
http://[www.mysite.com/mywebapp]/Pages/Default.aspx
Run Code Online (Sandbox Code Playgroud)
我只是出于好奇而问.
编辑2:感谢所有的回复,但没有一个是我正在寻找的.仅供参考,我以这种方式解决了问题(但我仍然有兴趣知道是否有更顺畅的方式):
public string GetWebAppRoot()
{
if(HttpContext.Current.Request.ApplicationPath == "/")
return "http://" + HttpContext.Current.Request.Url.Host;
else
return "http://" + HttpContext.Current.Request.Url.Host + HttpContext.Current.Request.ApplicationPath;
}
Run Code Online (Sandbox Code Playgroud) 我想将包含xaml和cs文件以及其他目录的文件夹添加到VS上的其他项目中.出于某种原因,当我将文件夹从Windows资源管理器拖到我想要放置该目录的项目时,visual studio不会让我.因此我手动添加每个文件,每次遇到目录时都要创建它.也许是因为我正在使用团队基础服务器.
无论如何我手动添加文件所以我点击我要在visual studio上添加文件的文件夹然后点击添加现有文件.然后我选择xaml和代码隐藏文件:

当我点击添加文件时添加但Visual Studio无法识别Bytes.xaml.cs是背后的代码!

我是否必须手动添加窗口然后复制并粘贴文件的内容?
code-behind ×10
asp.net ×4
c# ×3
wpf ×3
.net ×2
android ×1
asp.net-mvc ×1
c#-4.0 ×1
contextmenu ×1
dynamic ×1
grid ×1
gridlength ×1
html ×1
httpcontext ×1
javascript ×1
label ×1
mvvm ×1
show ×1
views ×1