2014-09-19 4 views
0

Outlook 2013의 새 전자 메일 리본에 사용자 정의 토글 버튼을 추가했습니다. 버튼을 토글하면 메일 메시지에 사용자 속성이 추가됩니다.리본 토글 버튼 예상대로 getPressed()가 호출되지 않음

public void OnLockButton(Office.IRibbonControl control, bool pressed) 
    { 
     Outlook.MailItem mi = Globals.ThisAddIn.Application.ActiveInspector().CurrentItem as Outlook.MailItem; 
     var userProp = mi.UserProperties.Add("MyIsLocked", Outlook.OlUserPropertyType.olYesNo, false); 
     userProp.Value = pressed; 

     // Make sure we update the ribbon 
     ribbon.Invalidate(); 
    } 

버튼의 "전환"상태는 사용자 속성의 상태를 검사하는 getPressed() 콜백으로 업데이트되고 :

public bool GetLockButtonPressed(Office.IRibbonControl control) 
    { 
     Outlook.MailItem mailItem = Globals.ThisAddIn.Application.ActiveInspector().CurrentItem as Outlook.MailItem; 
     var userProp = mailItem.UserProperties.Find("NMIsLocked"); 

     bool isLocked = (userProp != null && userProp.Value); 

     return isLocked; 
    } 

모든 작업을 잘한다.

는 문제가 발생했을 때 :

  1. 를 열고 새 메일 메시지
  2. 토글 버튼
  3. 폐기 메일 메시지
  4. 를 열고 새 메일 메시지

에서에

  • 스위치 이 시점은 사용자 속성이 해당 메시지에 설정되어 있지 않더라도 토글 버튼이 새 메일 메시지에서 켜져있는 것처럼 보입니다. 이자형.

    디버거에서 getPressed()가 새 메시지에 대해 호출되지 않는 것을 볼 수 있으므로 리본 단추 상태가 마지막으로 그린 ​​시간과 같다고 생각합니다.

    내가 가지고있는 아이디어 중에는 메일 메시지를 열었을 때 (또는 닫혀있을 때) 리본이 무효화되는 것이 포함되어 있습니까? 아니면 내가 놓친 다른 방법이 있습니까?

    Outlook의 '우선 순위 높음'토글 버튼과 비슷한 기능을 찾고 있습니다.

  • +0

    이 http://social.msdn.microsoft.com/Forums/vstudio/en-US/ae3049ce-4c16-4d24-9183-961fc6be5944/vsto-c-outlook-addin-default-toggle-button -state? forum = vsto가 도움이 될 것입니다. 대답하는 사람이 그것에 책을 썼습니다! http://www.slovaktech.com/Books.htm –

    답변

    2

    this 스레드에 표시된 것처럼 관리자가 활성화 될 때 리본을 무효화하려면 콜백이 필요합니다. 새로운 인스펙터가 생성 될 때마다이 이벤트 핸들러를 추가 할 수 있습니다.

    public class MyRibbon: Office.IRibbonExtensibility 
    { 
        private Office.IRibbonUI ribbon; 
    
        public void Ribbon_Load(Office.IRibbonUI ribbonUI) 
        { 
         this.ribbon = ribbonUI; 
         // ensure that any new inspectors created have a callback to refresh the button state on ativation. 
         Globals.ThisAddIn.Application.Inspectors.NewInspector += Inspectors_NewInspector; 
        } 
    
        void Inspectors_NewInspector(Outlook.Inspector Inspector) 
        { 
         ((Outlook.InspectorEvents_10_Event)Inspector).Activate += Inspector_Activate; 
        } 
    
        void Inspector_Activate() 
        { 
         ribbon.Invalidate(); 
        } 
    }