Hello,
I just created a docker in visual studio.
I have attached something with Page.Properties that displays in docker.
but how can i refresh docker when user change page in coreldraw.
I have find document.pagechange or pageactivate event but don't know how to use.
please guide me.
Thanks!
The new modification does not change anything in its behavior...
I found the Unloaded event and I tried to use it for removing of event registry but without success.
I tried:
[code]
public DockerUI(corel.Application app)
{
.
this.Unloaded += MyTerminationDocker;
}
private void MyTerminationDocker(object sender, EventArgs e)
MessageBox.Show("By!");
foreach (corel.Document doc in this.corelApp.Documents)
UnRegistryPageEvent(doc);//???
void UnRegistryPageEvent(corel.Document doc)
doc.PageActivate -= (p) =>
//Do somethings
global::System.Windows.MessageBox.Show(p.Name);
};
[/code]
Unloaded event is fired. I receive the 'By!' message but I'm afraid I did not understand how to remove event registry, even if you tried a clue... I tried something (see my attempt to use '-=') but obviously wrong...
After docker closing all remained documents keep their PageActivate event... It looks that in case of subscribing the event by anonymous method you need to use delegate and I do not understand how to do it in my case (using Page)...
Another strange behavior would be the next: If the docker is active (based on my previous version) the new created document (Untitled-1) sometimes doesn't register the event. If the docker is not active, I open some documents and activate the docker after that all of them have the event registered...
Can you help me again, please...?
Thanks in advance!
Hi, let's make this, this time i take some tests, but still have a couple of errors.
The follow code is a generic class, can use she in any x8 adds, controls, docker, vsta, tool
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
using System; using Corel.Interop.VGCore; namespace PageTest { public class ActivePageChangeEventArgs { private Page page; private bool existPage = true; public Page Page{get{return this.page;}} public bool ExistPage { get { return this.existPage; } } public ActivePageChangeEventArgs(Page page) { this.page = page; if (page == null) this.existPage = false; } } public class PageActiveController : IDisposable { private Application app; public delegate void ActivePageChangeEventHandler(ActivePageChangeEventArgs e); private object pageChangeLock = new object(); private ActivePageChangeEventHandler pageHandler; public event ActivePageChangeEventHandler ActivePageChange { add { lock(pageChangeLock) { pageHandler -= value; pageHandler += value; } } remove { lock(pageChangeLock) { pageHandler -= value; } } } public PageActiveController(Application app) { this.app = app; foreach (Document doc in this.app.Documents) { RegisterEvents(doc); } this.app.DocumentOpen += app_DocumentOpen; this.app.DocumentNew += app_DocumentNew; this.app.WindowActivate += app_WindowActivate; } void app_WindowActivate(Document Doc, Window Window) { EventDispacher(Doc.ActivePage); } void app_DocumentNew(Document Doc, bool FromTemplate, string Template, bool IncludeGraphics) { RegisterEvents(Doc); } void app_DocumentOpen(Document Doc, string FileName) { RegisterEvents(Doc); } public void Dispose() { UnRegisterDocEvents(); } ~PageActiveController() { UnRegisterDocEvents(); } private void EventDispacher(Page page) { if (pageHandler != null) pageHandler(new ActivePageChangeEventArgs(page)); } private void RegisterEvents(Document doc) { doc.PageActivate += doc_PageActivate; doc.PageChange += doc_PageChange; doc.PageCreate += doc_PageCreate; doc.PageDelete += doc_PageDelete; } void doc_PageDelete(int Count) { EventDispacher(this.app.ActiveDocument.ActivePage); } void doc_PageCreate(Page Page) { EventDispacher(Page); } void doc_PageChange(Page Page) { EventDispacher(Page); } void doc_PageActivate(Page Page) { EventDispacher(Page); } public void UnRegisterDocEvents() { try { foreach (Document doc in this.app.Documents) { doc.PageActivate -= doc_PageActivate; doc.PageChange -= doc_PageChange; doc.PageCreate -= doc_PageCreate; doc.PageDelete -= doc_PageDelete; } this.app.DocumentNew -= app_DocumentNew; this.app.DocumentOpen -= app_DocumentOpen; this.app.WindowActivate -= app_WindowActivate; } catch(Exception erro) { throw erro; } } } }
Use exemple, update simple UI, need implement update UI in docker load
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
using System; using System.Windows; using System.Windows.Controls; using corel = Corel.Interop.VGCore; namespace PageTest { public partial class DockerUI : UserControl { private corel.Application corelApp; private int registrationCount = 0; PageActiveController pg; public DockerUI(corel.Application app) { this.corelApp = app; InitializeComponent(); pg = new PageActiveController(app); pg.ActivePageChange += pg_ActivePageChange; this.Unloaded += DockerUI_Unloaded; } void DockerUI_Unloaded(object sender, RoutedEventArgs e) { pg.UnRegisterDocEvents(); } void pg_ActivePageChange(ActivePageChangeEventArgs e) { try { if (e.ExistPage) { updateMyUI(new string[2]{e.Page.Name,e.Page.Shapes.Count.ToString()}); } else global::System.Windows.MessageBox.Show("No page active"); } catch(Exception erro) { global::System.Windows.MessageBox.Show(erro.Message); } } void updateMyUI(string[] data) { lba_pageName.Content = data[0]; lba_numShapes.Content = data[1]; } } }
Need more improvements, and bug corrections
I'm impressed... A lot of useful things for somebody not so skilled in C# like me. I am trying a way which looked easier to me. I'm trying to avoid lambda expressions and in this way unsubscribing should work. At least this is what I hope and test. I saved your generic class in a safe place and if what I am trying doesn't work I definitely will use it . Thank you again!
My thought looked to work...
Eliminating lambda expressions all event handlers were not anonymous any more and they could be found and events unsubscribed. Here's the code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
public partial class DockerUI : UserControl { private corel.Application corelApp; public DockerUI(corel.Application app) { this.corelApp = app; InitializeComponent(); foreach (corel.Document doc in this.corelApp.Documents) { RegistryPageEvent(doc); } this.corelApp.DocumentOpen += RegistryPageEventOpen; this.corelApp.DocumentNew += RegistryPageEventNew; this.Unloaded += app_DockerUnloaded; } void RegistryPageEventOpen(corel.Document doc, string FileName) { doc.PageActivate += app_PageActivated; } void RegistryPageEventNew(corel.Document doc, bool fT,string t, bool inclG) { doc.PageActivate += app_PageActivated; } //pageActivated event... void app_PageActivated(corel.Page pag) { MessageBox.Show(pag.Name, "Docker_Event"); } void RegistryPageEvent(corel.Document doc) { doc.PageActivate += app_PageActivated; } void UnRegistryPageEvent(corel.Document doc) { doc.PageActivate -= app_PageActivated; } void app_DockerUnloaded(object sender, RoutedEventArgs e) { corelApp.DocumentOpen -= RegistryPageEventOpen; corelApp.DocumentNew -= RegistryPageEventNew; foreach (corel.Document doc in this.corelApp.Documents) { UnRegistryPageEvent(doc); } MessageBox.Show("Terminated..."); } private void btHello_Click(object sender, RoutedEventArgs e) { MessageBox.Show("Hello from my docker!", "Greetings..."); } }
Finally I succeed to use hilite.me...
Thanks for that, too!
Just a quick reference CorelDRAW has several events that can be listened to. You can find a list in this article:
Custom Dockers in CorelDRAW, Corel DESIGNER and Corel PHOTO-PAINT
-Shelby
I'm trying to fill some docker text boxes with document Width and Height followed by unit of measure but instead of the real document unit of measure it always shows millimeters. And it also transforms in millimeters the real units of measure. Only first time on WindowActivate runs for a new document it shows inches (dimensions and measuring units).
In VBA code is happening exactly the same thing. In X8 I mean. In X6 it returns the real dimensions and measuring units...
Is it something which I do wrong and I'm missing it?
Here is the code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
void UpdateDockerFields(corel.Document doc, corel.Window window) { this.txtName.Text = this.corelApp.ActiveDocument.Name; this.txtPagHeight.Text = this.corelApp.ActivePage.SizeHeight.ToString(); this.txtPagWidth.Text = this.corelApp.ActivePage.SizeWidth.ToString(); this.txtMU.Text = UM(this.corelApp.ActiveDocument.Unit.ToString()); } private string UM(string um) { switch(um) { case "cdrInch": return "Inch"; case "cdrMillimeter": return"mm"; case "cdrCentimeter": return"cm"; case "cdrPixel": return"pixel"; case "cdrMeter": return"m"; default: return"strange..."; } }