我正在根据模板分段构建一个大型文档。#OVERALLPAGENUMBER#每个模板的页脚中都有一个关键字,我以编程方式将其替换为字段(使用 Excel VBA)。
如果我需要的只是该文档的页码,那么以下内容就足够了:
Dim storyRange As Object 'Word.Range
For Each storyRange In oDoc.StoryRanges
Do
With storyRange.Find
.Text = "#OVERALLPAGENUMBER#"
.Wrap = 1 'wdFindContinue
.Execute
While .found
storyRange.Fields.Add Range:=storyRange, Type:=-1, Text:="PAGE", PreserveFormatting:=True
.Execute
Wend
End With
On Error Resume Next
Set storyRange = storyRange.NextStoryRange
On Error GoTo 0
Loop While Not storyRange Is Nothing
Next
Run Code Online (Sandbox Code Playgroud)
我已经测试了这段代码,它成功地将页码放入页脚中。然而,我想要的是一个嵌套(公式)字段,它将固定数字添加到页码,以便我可以显示多个文档的页数。我的解决方案,如果我手动执行(使用 Ctrl+F9),给出的字段代码如下所示:
{ = 5 + { PAGE } }
Run Code Online (Sandbox Code Playgroud)
并正确生成第 1 页上的“6”、第 2 页上的“7”等......
不管我怎么尝试,我都无法使用 VBA 复制这种字段嵌套。(宏记录器在这里没用)。有人能找到以编程方式创建这些字段的方法吗?
解决方案
我的问题是,拥有PreserveFormatting:=True阻碍了我将一个字段嵌套在另一个字段中的尝试。现在,以下简单的解决方案有效:
With …Run Code Online (Sandbox Code Playgroud) 清空Scripting.DictionaryExcel表格的最快方法是什么?这就是我现在正在做的事情,但是对于一个包含大约3000个元素的字典,它显然很慢.我做了我能想到的每一个优化.
这是我所拥有的一个简单的版本:
'wordCount and emailCount are late bound "Scripting.Dictionary" objects
Private Sub DictionaryToExcel(ByRef wordCount As Object, emailCount As Object)
oExcel.EnableEvents = False
oExcel.ScreenUpdating = False
Set oWorkbook = oExcel.Workbooks.Add
oExcel.Calculation = -4135
With oWorkbook.Sheets(1)
iRow = 1
For Each strKey In wordCount.Keys()
iWordCount = wordCount.Item(strKey)
iEmailCount = emailCount.Item(strKey)
If iWordCount > 2 And iEmailCount > 1 Then
.Cells(iRow, 1) = strKey
.Cells(iRow, 2) = iEmailCount
.Cells(iRow, 3) = iWordCount
iRow = iRow + 1
End If
Next strKey …Run Code Online (Sandbox Code Playgroud) 我在这里理解这个故事:
LDR r0, [pc, 0x5678]相当于这个"C代码"
r0 = *(pc + 0x5678)它是使用基本偏移量解引用的指针.
我的问题是:
我找到了这段代码
LDR PC, [PC,-4]
它被评论为猴子修补等.
我如何理解这段代码
pc = *(pc - 4)
在这种情况下,"pc"寄存器将取消引用前一条指令的地址,并将包含指令的"机器代码"(不是指令的地址),程序将跳转到该无效地址继续执行,可能我们将"分段故障".那么我缺少或不理解?
让我思考的是LDR指令中第二个操作数的括号.据我所知,x86架构上的括号已经取消引用指针,但我无法理解ARM架构中的含义.
mov r1, 0x5678 add r1, pc mov r0, [r1]
这段代码相当于?
LDR r0, [pc, 0x5678]
我在这个问题中读到:在VB中覆盖事件
在C#中覆盖事件甚至是错误的.C#编程指南说:不要在基类中声明虚拟事件,并在派生类中覆盖它们.C#编译器在Microsoft Visual Studio 2008中无法正确处理这些问题,并且无法预测派生事件的订阅者是否实际订阅了基类事件.我想知道为什么框架类会破坏这个规则,甚至编译器为什么允许它.
我无法理解为什么覆盖事件是一个错误.当然,继承类总是可以监视基类事件并在之后采取自己的操作,但是如果它想确保它是第一个查看事件的事件观察者呢?它想在某些条件下决定吞下这个事件?做这样的事情有什么问题:
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
VerifyActiveCountMatches();
base.OnCollectionChanged(e);
InvokePropertyChanged("Count");
}
Run Code Online (Sandbox Code Playgroud) 我一直在试图用树枝将树木的变化合并到树干上.
大约一个月前,行李箱(5.0)分支(至6.0).从那时起,已经在6.0分支上进行了开发,但是对主干也进行了热修复.我现在想要更新6.0.x分支,其中包含对主干所做的所有更改,因为6.0分支是在大约一个月前从5.0主干形成的.
有没有办法在不检查trunk(5.0.x)和分支(6.0.x)以及使用第三方工具来协调差异的情况下执行此操作?
我试图愚弄我正在交给其他人的仪表板,它包含一些数组公式.如果有人编辑其中一个数组公式并忘记命中Ctrl+Shift+Enter,那么现在所发生的一切都是公式开始以微妙的方式返回错误的结果.
我想要的是某种IF检查,我可以添加到公式,如果他们忘记输入它作为数组公式,将允许我返回一个明确的错误.
就像是:
=IF(IsArrayFormula, NormalFormula, "Ctrl+Shift+Enter Required")
Run Code Online (Sandbox Code Playgroud)
VBA对我来说不是一个选择,但如果你想为没有这个限制的人留下VBA解决方案我不会投票.
为什么我收到此错误消息?我正在使用事件设定器!
<Style TargetType="{x:Type xcdg:DataCell}">
<EventSetter Event="LostFocus" Handler="cellLostFocusHandler" />
</Style>
Run Code Online (Sandbox Code Playgroud)
编辑
我没有使用内联样式.它在资源中,即:
<DataGrid.Resources>
<Style TargetType="{x:Type xcdg:DataCell}">
<EventSetter Event="LostFocus" Handler="cellLostFocusHandler" />
</Style>
</DataGrid.Resources>
Run Code Online (Sandbox Code Playgroud) 我将我的xaml中两个超链接的command属性绑定到视图中的命令(这是datacontext):
<TextBlock>
<Hyperlink x:Name="linkCheckAll" Command="{Binding CheckAllZonesCommand}" CommandParameter="{Binding}">Check All</Hyperlink>
<TextBlock Margin="0,0,20,0"/>
<Hyperlink x:Name="linkUncheckAll" Command="{Binding UncheckAllZonesCommand}" CommandParameter="{Binding}">Uncheck All</Hyperlink>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
看起来像这样:

绑定命令时出现以下错误:
System.Windows.Data Error: 40 : BindingExpression path error: 'CheckAllZonesCommand' property not found on 'object' ''ZonesView' (HashCode=56756307)'. BindingExpression:Path=CheckAllZonesCommand; DataItem='ZonesView' (HashCode=56756307); target element is 'Hyperlink' (HashCode=50738642); target property is 'Command' (type 'ICommand')
System.Windows.Data Error: 40 : BindingExpression path error: 'UncheckAllZonesCommand' property not found on 'object' ''ZonesView' (HashCode=56756307)'. BindingExpression:Path=UncheckAllZonesCommand; DataItem='ZonesView' (HashCode=56756307); target element is 'Hyperlink' (HashCode=53994596); target property is 'Command' (type 'ICommand')
Run Code Online (Sandbox Code Playgroud)
"ZonesView"是我的dataContext,我很肯定它包含有问题的命令:
public class …Run Code Online (Sandbox Code Playgroud) 我无法弄清楚适用于我的资源的相对路径.我已经尝试了我能想到的一切.唯一有效的是绝对路径只在我的系统上正确,但在任何部署版本中都是不正确的.
据我所知,这条非常简单的路径应该有效.
public class GreyscaleEffect : ShaderEffect
{
private static PixelShader _pixelShader = new PixelShader()
{ UriSource = new Uri("/Effects/Greyscale.ps", UriKind.Relative) };
Run Code Online (Sandbox Code Playgroud)
我得到错误The type initializer for 'FSR.WPF.Utilities.UI. GreyscaleEffect' threw an exception.内部异常:Cannot locate resource 'effects/greyscale.ps'.
我也尝试过以下方法:
Uri(";component/Effects/Greyscale.ps", UriKind.Relative)
Uri("/;component/Effects/Greyscale.ps", UriKind.Relative)
Uri("/FSR.WPF.Utilities.UI;component/Effects/Greyscale.ps", UriKind.Relative)
Run Code Online (Sandbox Code Playgroud)
在其他地方(在MUSUI的xaml文件中),使用以下路径,它工作正常:
<Image Source="/FSR.WPF.Utilities.UI;component/assets/CurrencyFlags/USD.png"
Run Code Online (Sandbox Code Playgroud)
所以我无法弄清楚为什么这种类似的情况不起作用.
只有以下绝对路径有效:
Uri("C:\TFS\MUS 6.1.x\Mosaic Middleware\FSR.WPF.Utilities\FSR.WPF.Utilities.UI" +
"\Effects\Greyscale.ps")
Run Code Online (Sandbox Code Playgroud)
我也@使用UriKind.Absolute在字符串前面使用的每个组合尝试了所有上述内容,并完全省略了第二个参数.没有什么可行,但绝对的道路,我正在失去理智.
这是解决方案结构.主项目是MUSUI,底部是粗体.此效果类和.ps文件都位于Effects文件夹中,该文件夹位于引用的程序集FSR.WPF.Utilities.UI的根目录中.

无论如何,我知道这必须以某种方式工作.任何能够找出最短工作相对路径的人,特别是如果它不需要在程序集名称中进行硬编码,就会获得奖励.
大多数转换器不带参数或一个固定参数,并且易于绑定到:
<local:MyConverter x:Key="MyConverterInstance" />
<TextBox Text="{Binding Path=MyTime,
Converter={StaticResource MyConverterInstance},
ConverterParameter='yyyy/MM/dd'}" />
Run Code Online (Sandbox Code Playgroud)
但是,如果我希望该格式是用户可以更改的动态属性,我不能做这样的事情,对吧?:
<TextBox Text="{Binding Path=MyTime,
Converter={StaticResource MyConverterInstance},
ConverterParameter={Binding Path=UserFormat}}" />
Run Code Online (Sandbox Code Playgroud)
所以我唯一的选择是在MyConverter上定义DependencyProperty以进行绑定.但我的转换器定义是StaticResource.我不能去
<local:MyConverter x:Key="MyConverterInstance"
Format="{Binding Path=UserFormat}"/>
Run Code Online (Sandbox Code Playgroud)
因为StaticResources上没有DataContext.我怎么设置它?
虽然某些 Office 功能区控件属性可以直接设置(例如标签),但大多数使用回调来设置属性。例如按钮的图像:
<button id="btnRecalculate" getImage="GetRibbonControlImage" label="Recalculate Now" onAction="OnButtonAction" size="normal" />
Run Code Online (Sandbox Code Playgroud)
文档对这些回调的语法非常清楚,但没有说明调用它们的时间和频率。
我现在面临一个问题,当以编程方式更改值时,我想修改功能区上的其中一个属性(例如按钮上的工具提示)。我为超级提示定义了一个回调,如下所示:
<button id="btnSetServerURL" getSupertip="GetSuperTip" label="Set Server URL" />
Run Code Online (Sandbox Code Playgroud)
以及隐藏的代码:
public string GetSuperTip(IRibbonControl control)
{
switch( control.Id )
{
case "btnSetServerURL":
return "Click to set the server URL. (Currently: " + API.URL + ")";
default:
return "";
}
}
Run Code Online (Sandbox Code Playgroud)
当该 URL 更改时,下次用户将鼠标悬停在该按钮上时,我希望调用 GetSuperTip 回调并显示消息以显示正确的当前 URL,但现在该值只是第一次设置,再也不会设置。
有什么办法可以得到我寻求的行为吗?这是一个 Excel 插件,据我所知,WPF 样式绑定不是一个选项。
我遇到了Json.NET Parser的问题.根据文档,简单地使用ToString()没有特殊的转换器应该保持Json不变.
然而,我的Json字符串正在被修改,它的日期会自动本地化,并且它会给我带来各种各样的问题.例如,当我向它提供以下字符串时:
{
"_type": "Basic",
"id": "44902a0f-7842-3a2d-83bf-a874ce0b47a1",
"description": "TestBasicDescription",
"participation": 1.000000000000000,
"inception_date": "2014-02-06T20:34:00.925000+00:00",
"expiry_date": "0001-01-01T00:00:00+00:00"
}
Run Code Online (Sandbox Code Playgroud)
我期待代码
Newtonsoft.Json.Linq.JObject.Parse(content).ToString(Formatting.None);
Run Code Online (Sandbox Code Playgroud)
产生几乎相同的字符串.然而,我得到的是:
{
"_type": "Basic",
"id": "44902a0f-7842-3a2d-83bf-a874ce0b47a1",
"description": "TestBasicDescription",
"participation": 1.0,
"inception_date": "2014-02-06T16:34:00.925-04:00",
"expiry_date": "0001-01-01T20:00:00-04:00"
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我的日期已经本地化.
更糟糕的是,在边界日期的情况下(DateTime.MinValue如上所示),这种自动本地化的值实际上是错误的.时区偏移导致小时值环绕,并且由于日期不能更低,它不会改变,有效地将日期转换为DateTime.MinValue加1天:当它转换回UTC时间(原来是)时日期变成了"0001-01-02T00:00:00+00:00".提示单元测试爆炸.
为什么Json.Net的表现不像它说的那样?有没有办法解析输入Json然后ToString()它完全按原样解析?
c# ×5
wpf ×5
.net-4.0 ×4
excel ×4
xaml ×4
.net-3.5 ×2
binding ×2
vba ×2
arm ×1
assembly ×1
callback ×1
coding-style ×1
converter ×1
dictionary ×1
excel-addins ×1
excel-vba ×1
json.net ×1
ms-word ×1
optimization ×1
patch ×1
ribbon ×1
tfs ×1
word-field ×1