我试图在我的 WPF 应用程序中跨元素保持统一的外观和感觉,同时我想创建一个修改后的TextBox. 但是,当我这样做时,我在应用程序级别定义的样式TextBox不会应用于我创建的类,即使为我的自定义控件创建的样式正在使用该BasedOn属性。
是不是我遗漏了什么导致它的行为与我预期的不同?
我使用以下设置在 VS2010 中的一个全新 WPF 项目中重现了该问题:
C# 代码:
public class CustomTextBox : TextBox
{
static CustomTextBox() {
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomTextBox), new FrameworkPropertyMetadata(typeof(CustomTextBox)));
}
}
Run Code Online (Sandbox Code Playgroud)
XAML 中Themes\Generic.xaml:
<Style TargetType="{x:Type local:CustomTextBox}" BasedOn="{StaticResource {x:Type TextBox}}"/>
Run Code Online (Sandbox Code Playgroud)
XAML 中App.xaml:
<Application.Resources>
<Style TargetType="TextBox">
<Setter Property="Background" Value="Red"/>
</Style>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)
但是,在设计器中,当我运行应用程序时CustomTextBox,即使该BasedOn属性的文档表明我的派生类应该具有这种样式,但仍使用文本框的默认样式而不是红色背景...
可以通过多种方式扩展或继承 WPF 中的样式。样式可以通过此属性基于其他样式。使用此属性时,新样式将继承未在新样式中明确重新定义的原始样式的值。
...
注意:如果您创建具有 TargetType 属性的样式并基于另一个同样定义 TargetType 属性的样式,则派生样式的目标类型必须与基样式的类型相同或派生自基样式的类型。
我有一个Python 3脚本,从URL获取一些JSON,处理它,并通知我,如果我得到的数据有任何重大变化.我尝试过使用notify2和PyGObject的libnotify绑定(gi.repository.Notify),并用这两种方法得到类似的结果.当我从终端运行它时,这个脚本工作正常,但是当cron尝试运行它时会窒息.
import notify2
from gi.repository import Notify
def notify_pygobject(new_stuff):
Notify.init('My App')
notify_str = '\n'.join(new_stuff)
print(notify_str)
popup = Notify.Notification.new('Hey! Listen!', notify_str,
'dialog-information')
popup.show()
def notify_notify2(new_stuff):
notify2.init('My App')
notify_str = '\n'.join(new_stuff)
print(notify_str)
popup = notify2.Notification('Hey! Listen!', notify_str,
'dialog-information')
popup.show()
Run Code Online (Sandbox Code Playgroud)
现在,如果我创建一个notify_pygobject使用字符串列表调用的脚本,cron会通过邮件假脱机将此错误抛回给我:
Traceback (most recent call last):
File "/home/p0lar_bear/Documents/devel/notify-test/test1.py", line 3, in <module>
main()
File "/home/p0lar_bear/Documents/devel/notify-test/test1.py", line 4, in main
testlib.notify(notify_projects)
File "/home/p0lar_bear/Documents/devel/notify-test/testlib.py", line 8, in notify
popup.show()
File "/usr/lib/python3/dist-packages/gi/types.py", line 113, in function
return info.invoke(*args, **kwargs) …Run Code Online (Sandbox Code Playgroud) 当我的数据库打开时,它会显示一个带有"加载栏"的表单,该表单在显示"主菜单"表单之前报告链接外部表等的进度.主菜单有一些代码,可以在幕后以编程方式生成一个表单,上面有按钮,当它完成后,它会保存并重命名表单,并将其指定为SourceObject子表单.
这一切都很好,花花公子,也就是说,直到我决定让按钮实际做一些有用的事情.在生成按钮的循环中,它将VBA代码添加到子窗体的模块中.出于某种原因,这样做会使VBA完成执行,然后停止.这使得(模态)加载形式不会消失,因为有一个If语句DoCmd.Close在完成加载时执行a 来关闭加载表单.它还会破坏依赖于所设置的全局变量的功能,因为在执行暂停时会清除全局变量.
有没有更好的方法来创建以编程方式执行操作的按钮,而不是放弃直接访问和编写实际代码?尽管我很乐意,但是如果我离开公司,我不得不在Access中这样做,以便那些技术娴熟的员工在我缺席的情况下仍能使用它.
如果需要,下面是相关代码的点点滴滴.
Form_USysSplash:
'Code that runs when the form is opened, before any processing.
Private Sub Form_Open(Cancel As Integer)
'Don't mess with things you shouldn't be.
If g_database_loaded Then
MsgBox "Please don't try to run the Splash form directly.", vbOKOnly, "No Touching"
Cancel = True
Exit Sub
End If
'Check if the user has the MySQL 5.1 ODBC driver installed.
Call CheckMysqlODBC 'Uses elfin majykks to find if Connector/ODBC is installed, …Run Code Online (Sandbox Code Playgroud) .net-4.0 ×1
access-vba ×1
dbus ×1
libnotify ×1
ms-access ×1
pygobject ×1
python-3.x ×1
vba ×1
wpf ×1
xaml ×1